在外键 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
。模型处理数据的存储方式 ,与数据的呈现方式无关。
我必须使用不同的字段作为外键,不仅是 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
。模型处理数据的存储方式 ,与数据的呈现方式无关。