如何通过 django 中的父表访问中间表字段?

Posted

技术标签:

【中文标题】如何通过 django 中的父表访问中间表字段?【英文标题】:how can i access to the intermediary table fields through the parent table in django? 【发布时间】:2020-10-31 10:53:14 【问题描述】:

这是我的桌子:

class MyUser(models.Model):
    pass

class Product(models.Model):
    name = models.CharField()

class Order(models.Model):
    customer = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    products = models.ManyToManyField(Product , through='MidCartProduct')

class MidCartProduct(models.Model):
    class Meta : 
        unique_together = (('order_id' , 'product_id'))

    order_id = models.ForeignKey(Order , on_delete=models.CASCADE)
    product_id = models.ForeignKey(Product , on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField()

那么我如何通过Order 表访问中间表quantity 字段? 这可能吗?

我试图这样做但没有工作:

>>> a = Order.objects.first().products.first()
>>> a.quantity
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Order' object has no attribute 'quantity'

对不起我的英语不好

【问题讨论】:

【参考方案1】:

您改为迭代 midcartproduct_set

myorder = Order.objects.first()
for midcartproduct in myorder.midcartproduct_set.all():
    print(midcartproduct.quantity, midcartproduct.product_id)

由于您可能需要所有Products,因此您最好为此添加.select_related(…) [Django-doc]:

myorder = Order.objects.first()
for midcartproduct in myorder.midcartproduct_set.select_related('product_id'):
    print(midcartproduct.quantity, midcartproduct.product_id)

注意:通常不会在 ForeignKey 字段中添加后缀 _id,因为 Django 将自动添加一个带有_id 后缀的“孪生”字段。因此应该 是product,而不是product_id

【讨论】:

以上是关于如何通过 django 中的父表访问中间表字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套的子表值与父表行关联并插入子表值对应于php中的父表行

什么是数据库中的父表和子表?

如何从mysql5中的父表中删除数据?

mysql - 如何使用父表中的值将连接表连接到另一个连接表?

外键约束

Django 中间模型中的访问字段