Skip to main content
 首页 » 编程设计

python之如果我知道第一个字段值,如何从模型中获取另一个字段值

2025年05月04日13duanxz

我正在尝试学习 Django 并遇到访问模型的问题。

我在 models.py 中有一个看起来像这样的模型:

class Countries(models.Model): 
 
    Country = models.CharField(max_length=200) 
 
    PPP = models.DecimalField(max_digits=15, decimal_places=10) 
 
    def __str__(self): 
        return self.Country 

现在在 views.py 中,我想根据用户输入进行一些计算。用户将从第一个字段 (Country) 中选择值,我需要根据该值找到第二个字段值 (PPP)。

这意味着我有类似这样的数据结构:

Country   | PPP 
---------------- 
Lithuania | 0.45 
Germany   | 0.86 
Estonia   | 0.55 
Spain     | 0.77 

所以我会知道国家,我需要访问它的 PPP。我应该怎么做?

因为我尝试过的各种解决方案都给我一个错误。

我厌倦了 Lats 解决方案:

pVal = str(form.cleaned_data['Country']) 
country = Countries.objects.first() 
pValKof = getattr(country, pVal)  

根据我的研究,我觉得我应该接近解决方案,但我无法完全理解 getattr。或者,也许还有其他方法可以实现这一目标?

编辑:这是我的 forms.py

的相关部分
class PGPskaiciuokle(forms.Form): 
 
    country = forms.ModelChoiceField(queryset=Countries.objects.all(), 
                                       label="Choose country") 
 
    def clean_country(self): 
        country = self.cleaned_data['country'] 
        return country 

请您参考如下方法:

编辑:更改了我的解决方案,因为我错过了表单字段是 ModelChoiceField 的事实

代替:

pVal = str(form.cleaned_data['Country']) 
country = Countries.objects.first() 
pValKof = getattr(country, pVal)  

这样做:

country = form.cleaned_data['Country'] 
ppp = country.PPP 

此外:

  1. Python 中的属性应以小写字母开头,类以大写字母开头,因此不要使用 Country 和 PPP,而应使用 country 和 ppp(不确定 ppp 代表什么,使用 more 也无妨描述性名称)

  2. 模型名称应该是单数。所以不要使用国家/地区,而是使用国家/地区

  3. 属性 Country 可以更具描述性。尝试使用名称而不是国家/地区。

  4. 我会为每个国家/地区选择一个唯一的名称。

所以稍微清理一下你的代码:

class Country(models.Model): 
 
        name = models.CharField(max_length=200, unique=True, null=False) 
 
        ppp = models.DecimalField(max_digits=15, decimal_places=10) 
 
        def __str__(self): 
            return self.name 

和

country = form.cleaned_data['country'] 
ppp = country.PPP 

和表单文件:

class PGPskaiciuokle(forms.Form): 
 
    country = forms.ModelChoiceField(queryset=Country.objects.all(), 
                                   label="Choose country")