django 引用模型示例时返回字段值

mfuanj7w  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(108)

如果我有以下模型:

class VATPercentage(models.Model):
     percentage = models.IntegerField(default=21)

字符串
有没有什么方法可以使它在引用它的示例时,实际上得到存储在percentage字段中的值?
例如,我希望能够做到:Service.vat_percentage而不是Service.vat_percentage.percentage
类似于_ str在模型上调用str()的工作方式,但我需要一个整数。
我试图寻找类似的东西,如定义一个
int _函数,但我不认为这是一件事..

lrpiutwd

lrpiutwd1#

我觉得你的数据模型有点混乱。我理解您当前的数据模型看起来像这样:

class VATPercentage(models.Model):
     percentage = models.IntegerField(default=21)

class Service(models.Model):
    vat_percentage = models.ForeignKey('VATPercentage', cascade=models.SET_NULL)
    # probably other fields here

字符串
如果你想让实际值成为Service的一个属性,我认为它只是表明你应该像这样设置你的Service模型:

class Service(models.Model):
    percentage = models.IntegerField(default=21)


并完全摆脱VATPercentage
如果这真的不可能,那么你可以:

  • 注解查询集,例如:
service = Service.objects.annotate(vat_percentage_value=F('vat_percentage__percentage')).first()
service.vat_percentage_value  # will be the integer value

  • 或在模型上定义属性:
class Service(models.Model):
    vat_percentage = models.ForeignKey('VATPercentage', cascade=models.SET_NULL)
    # probably other fields here

    @property
    def vat_percentage_value(self):
        return self.vat_percentage.percentage


如果您不需要VATPercentage模型来做其他任何事情,我强烈建议您不要使用这两个选项。还要注意,我故意使用了一个不同的名称vat_percentage_value,以避免 * 隐藏 * ForeignKey字段的名称。
最后几点说明:

  • 我可能会在这里使用FloatField而不是IntegerField,这是合理的假设,你可能不总是有整数的值。
  • 是的,可以定义__int__()方法来实现内置的int()函数在传递对象时返回的内容。可能不是你想要的:)
cyej8jka

cyej8jka2#

我想,那是不可能的。如果在=的左边有instance,那么右边只有instance,没有更多,没有str或int!让我们尝试(假设我们有任何简单的汽车模型):

>>> from app.models import Car
>>> inst = Car.objects.first()
>>> inst
<Car: Mazeratti>
>>> type(inst)
<class 'app.models.Car'>

字符串
因此,如果你在代码中将变量赋值给对象,你的变量将包含object而不是string。
__str__在模板中用于对象,所以如果你发送<Car: Mazeratti>对象到模板,django 'known'需要做什么:显示你在str方法中写了什么,即mazeratti的值。
希望我解释清楚))

相关问题