Python 在foreignkey django中使用不同的字段
我必须使用不同的字段作为外键,而不仅仅是Python 在foreignkey django中使用不同的字段,python,django,Python,Django,我必须使用不同的字段作为外键,而不仅仅是strmethod字段 我试过了,但似乎不起作用,它只返回str方法字段数据: class ModelA(models.Model): admin = models.ForeignKey(User,on_delete=models.CASCADE) product = models.ForeignKey(Product,on_delete=models.CASCADE) invoice_id = models.IntegerFiel
str
method字段
我试过了,但似乎不起作用,它只返回str
方法字段数据:
class ModelA(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
product = models.ForeignKey(Product,on_delete=models.CASCADE)
invoice_id = models.IntegerField(unique=True)
def __str__(self):
return self.product.name
class ModelB(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
invoice = models.ForeignKey(ModelA,to_field='invoice_id',on_delete=models.CASCADE)
我需要在ModelB
invoice字段中显示所有invoice\u id
s,但它会显示product
s?谢谢你的帮助
我必须使用不同的字段作为ForeignKey,而不仅仅是str方法字段
ForeignKey
从不使用str
方法。默认情况下,它存储所引用对象的主键。如果指定了,则它将存储该字段
但是,如果您有一个ModelB
对象mymodelb
,并且您访问了ForeignKey
,因此mymodelb.invoice
,它将延迟获取相关对象。因此,在本例中,它将进行一个类似于选择modela.*的查询,其中invoice\u id=…
如果您想要外键存储的值
,则可以使用字段名\u id
,因此在本例中为。发票\u id
。这意味着您可以通过以下方式访问发票id:
mymodelb.invoice_id # invoice_id of the referred ModelA object
但是在这种情况下,您根本不需要在
ForeignKey
中指定to_字段
。模型处理的是数据的存储方式,而不是数据的呈现方式。它不会在字段中保存u str
。它保存对ModelA
对象的引用(例如通过主键,或通过invoice\u id
)。但是如果使用.invoice
,则它将获取相应的ModelA
对象。如果您想访问ModelB
中的invoice\u id
,可以使用mymodelb.invoice\u id
。感谢您的回复,您的意思是ModelA.invoice\u id在ModelB中?它会引发错误(AttributeError:type对象“ModelA”没有属性“invoice\u id”)?@art_cs:但关键是你不需要对模型做任何更改。对于ModelB
对象,只需使用.invoice\u id
获取invoice
外键的目标字段即可。因此,对于ForeignKey
字段blabla
,它会生成一个额外的字段blabla\u id
@art\u cs:但不需要指定字段。您只需编写invoice=models.ForeignKey(ModelA,到\u field='invoice\u id',在\u delete=models.CASCADE上)
。Django将在ModelB
中自动创建一个名为invoice\u id
的额外模型字段。因此,您基本上可以说,ForeignKey
将构造两个模型字段。@art\u cs:在这种情况下,您需要使用modelcoocefield
更改表单字段,并覆盖label\u from\u instance
@art\u cs:如编辑后的答案所示。您可以将modelcooicefield
子类化,例如在类InvoiceChoiceField
中,在该类中实现label\u from\u instance
,然后在表单中使用它。
from django import forms
class InvoiceChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return str(obj.invoice_id)
class ModelBForm(forms.ModelForm):
invoice = InvoiceChoiceField(queryset=ModelA.objects.all())