繁体   English   中英

如何从 django 中的 models.py 访问 ForeignKey 属性

[英]How to access ForeignKey properties from models.py in django

我想通过外键从 model 访问另一个 model 的属性。 例如,如果invoice_detailsInvoiceMaster的外键,那么我希望invoice_details存储InvoiceMasterinvoice_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中执行以下操作来获取OrderDetailsInvoiceMaster的详细信息:

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM