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())