【问题标题】:What exactly the reverse query name in its related model in Django?Django 相关模型中的反向查询名称到底是什么?
【发布时间】:2021-10-13 16:15:36
【问题描述】:

我遇到了与Django - reverse query name clash 中几乎相同的问题。

以下代码:

class Category(models.Model):
    title = models.CharField(max_length=255)
    featured_product = models.ForeignKey(
        'Product', on_delete=models.SET_NULL, null=True)

class Product(models.Model):
    title = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)

会有错误提示:

store.Category.featured_product: (fields.E303) Reverse query name for 'store.Category.featured_product' clashes with field name 'store.Product.category'.
     

我知道featured_productin Category 应该添加related_name="+" 以避免此错误。但由于这是一个多对一的情况,我认为store.Category.featured_productinProductclass 的反向查询名称应该是store.Product.category_set,所以它不应该与store.Product.category 发生冲突。

【问题讨论】:

  • 请给出一个正确的例子来实际重现你的问题...首先这会出错,因为你没有为外键指定on_delete(这是一个必需的 i> 论点)。接下来不是Supplier.default_tariff_set,而是Supplier.tariff_set,或者如果你设置了related_namerelated_query_name,那么就是这样。
  • @AbdulAzizBarkat 我又编辑了一遍,请看一下。

标签: django


【解决方案1】:

即使没有直接冲突(使用您拥有的 sn-p,生成的反向访问器应该是 Product.category_setCategory.product_set),我会说 Django 试图提供帮助,所以你不要在反向访问器方面犯错误。

正如您所说,您可以将 related_name='+' 设置为根本不创建反向访问器,但我可能会将反向访问器命名为 related_name='featured_product_for_categories'

毕竟,您的数据模型确实可以让产品出现在多个类别中,甚至是它不属于的类别中。

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 2018-09-13
    • 2021-01-24
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2013-06-24
    • 2020-01-02
    相关资源
    最近更新 更多