【问题标题】:How to get another field value from model if I know first field value?如果我知道第一个字段值,如何从模型中获取另一个字段值?
【发布时间】:2020-01-08 06:28:15
【问题描述】:

我正在尝试学习 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

【问题讨论】:

  • 请张贴您的forms.py
  • 添加了相关部分,抱歉我认为这与问题无关。

标签: python django python-3.x django-models


【解决方案1】:

编辑:更改了我的解决方案,因为我错过了表单字段是 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")

【讨论】:

    【解决方案2】:

    试试这个:

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

    这将获取Countries 对象,您可以从中轻松获取PPP。您可以获得Countires 对象,因为您在表单中使用了ModelChoiceField

    一些额外提示:

    • 将模型命名为单数(例如:Country 而不是 Countries
    • 将类变量命名为全部小写
    • 您的表单中不需要def clean_country(self): 方法

    【讨论】:

    • 感谢您的提示,清理了我的代码,要捕获所有使用旧名称的地方比我预期的要困难得多。以后最好第一次就写好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2021-12-29
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多