在外键 Django 中使用不同的字段

Using different fields in foreignkey django

我必须使用不同的字段作为外键,不仅是 str 方法字段!?

我试过了,但似乎不起作用,而且它只有 return 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_id,但它显示 product?感谢帮助

I have to use different fields for as ForeignKey not only str method field!?

A ForeignKey 从不使用 str 方法。它默认存储它引用的对象的主键。如果您指定 to_field=… [Django-doc],那么它将存储 that 字段。

然而,如果你有一个 ModelB 对象 mymodelb,并且你访问 ForeignKey,那么 mymodelb.invoice,它会懒惰地 fetch 相关对象。因此,在这种情况下,它将进行一个看起来像 SELECT modela.* FROM modela WHERE invoice_id = ….

的查询

如果你想要ForeignKey存储的值,你可以利用<i>fieldname</i>_id,所以在这个案例.invoice_id。这意味着您可以通过以下方式访问发票 ID:

mymodelb<b>.invoice_id</b>  # invoice_id of the referred ModelA object

如果你想在 Form 中显示 invoice_id,你应该覆盖 ModelChoiceField [Django-doc],然后在 ModelBForm 中你可以使用这个子类:

from django import forms

class <b>InvoiceChoiceField</b>(ModelChoiceField):
    
    def label_from_instance(self, obj):
        return str(obj.invoice_id)

class ModelBForm(forms.ModelForm):
    invoice = <b>InvoiceChoiceField(queryset=ModelA.objects.all())</b>

但在那种情况下,您根本不需要在 ForeignKey 中指定 to_field。模型处理数据的存储方式 ,与数据的呈现方式无关。