[英]How to access ForeignKey properties from models.py in django
我想通过外键从 model 访问另一个 model 的属性。 例如,如果invoice_details
是InvoiceMaster
的外键,那么我希望invoice_details
存储InvoiceMaster
的invoice_number
的值,而不是主键。 我怎样才能做到这一点?
我尝试了以下方法:
class OrderDetails(models.Model):
purchase_order_number = models.IntegerField(blank=True, null=True)
purchase_request_number = models.IntegerField(blank=True, null=True)
delivery_no = models.IntegerField(blank=True, null=True)
delivery_equipment = models.CharField(max_length=500, blank=True, null=True)
delivery_quantity = models.IntegerField(blank=True, null=True)
warranty_start_date = models.DateField()
warranty_end_date = models.DateField()
invoice_details = models.ForeignKey(InvoiceMaster, on_delete=models.CASCADE, blank=True, null=True).invoice_number
vendor_id = models.ForeignKey(VendorDetails, on_delete=models.CASCADE, blank=True, null=True).vendor_id
equipment_id = models.ForeignKey(EquipmentMaster, on_delete=models.CASCADE, blank=True, null=True).equipment_id
is_visible = models.IntegerField(default=1)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
creation_date = models.DateTimeField(default=timezone.now)
检查invoice_details
- 我试过在 ForeignKey 的末尾添加.invoice_number
。 在 ForeignKey 括号内将.invoice_details
添加到InvoiceMaster
给我以下错误: TypeError: ForeignKey(<django.db.models.query_utils.DeferredAttribute object at 0x10d632fd0>) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'
TypeError: ForeignKey(<django.db.models.query_utils.DeferredAttribute object at 0x10d632fd0>) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'
这是InvoiceMaster
模块:
class InvoiceMaster(models.Model):
invoice_number = models.CharField(max_length=50, blank=True, null=True)
equipment_name = models.ForeignKey(EquipmentMaster, on_delete=models.CASCADE, blank=True, null=True).name
quantity = models.IntegerField(blank=True, null=True)
is_visible = models.IntegerField(default=1)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
creation_date = models.DateTimeField(default=timezone.now)
出于某种原因,虽然我在这里的equipment_name
中做了与invoice_details
中相同的操作,但 Django 没有显示任何错误。 有关更多上下文,请查看EquipmentMaster
,其中equipment_name
具有通过 ForeignKey 的链接。
class EquipmentMaster(models.Model):
equipment_id = models.CharField(max_length=50, blank=True, null=True)
equipment_type = models.CharField(max_length=50, choices=equipment_categories)
name = models.CharField(max_length=200, blank=True, null=True)
ram = models.CharField(max_length=100, blank=True, null=True)
storage = models.CharField(max_length=100, blank=True, null=True)
display_size = models.CharField(max_length=100, blank=True, null=True)
paper_size = models.CharField(max_length=100, blank=True, null=True)
operating_system = models.CharField(max_length=100, blank=True, null=True)
is_visible = models.IntegerField(default=1)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
creation_date = models.DateTimeField(default=timezone.now)
请问这背后的目的是什么?
ForeignKey
只是与另一个字段的关系。 如果只是因为显示invoice_number
而不是 pk,请尝试添加以下内容:
class InvoiceMaster(models.Model):
invoice_number = models.CharField(max_length=50, blank=True, null=True)
# your other fields
def __str__(self).
return self.invoice_number
否则你只能直接从 ForeignKey 中获取 invoice_number
order = OrderDetails.objects.get(pk=1)
invoice_number = order.invoice_details.invoice_number
您可以通过在OrderDetails
中执行以下操作来获取OrderDetails
中InvoiceMaster
的详细信息:
@property
def invoice_number(self):
return self.invoice_details.invoice_number
这样,您可以通过调用order_details.invoice_number
从 order_details 获取invoice_number
。
您可能想在访问外键字段之前检查是否存在关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.