hi我试图使用to_field
从不同字段生成一个新的外键,但它返回product
值,而不是no_invoice
class Model1(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
product = models.ForeignKey(Products,on_delete=models.CASCADE)
no_invoice = models.IntegerField(unique=True)
def __str__(self):
return self.product.name
class Model2(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
invoice = models.ForeignKey(Model1,to_field='no_invoice',on_delete=models.CASCADE)
我还有什么要补充的吗?感谢
ForeignKey.to_field关系所在的相关对象上的字段。默认情况下,Django使用相关对象的主键。如果引用其他字段,则该字段必须具有unique=True。
就你而言,没有什么可补充的。
当您尝试获取外键字段时,它会返回QuerySet 中所有相关的Model1对象
您的str方法错误。你必须自己去拿。像低于
def __str__(self):
return self.product.name
默认情况下,此方法返回模型对象的id(主键(当您尝试打印或呈现外键字段时,由于str方法正在返回产品名称,因此会返回Model1对象的字符串表示,即产品名称。
相反,如果你想获得你的无发票字段
您可以将str替换为
def __str__(self):
return self.no_invoice
或
您可以访问整个对象。你也可以在你的视图中这样做.py.
m2_object = Model2.objects.all().first()
print(m2_object.invoice.no_invoice) #this will give your no_invoice value
参考:https://docs.djangoproject.com/en/3.0/ref/models/fields/
既然no_invoice
是唯一的,而且看起来像Model1
的序列号,你能把它作为主键吗?像这样:
class Model1(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
product = models.ForeignKey(Products,on_delete=models.CASCADE)
no_invoice = models.IntegerField(primary_key=True)
def __str__(self):
return self.product.name #self should be included
class Model2(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
invoice = models.ForeignKey(Model1,on_delete=models.CASCADE)
PS:如果从Model2到Model1的关系是OneToOne
,您也可以考虑使用OneToOne
关系而不是外键。