【问题标题】:Not able to access related model data using foreign key in Django无法在 Django 中使用外键访问相关模型数据
【发布时间】:2021-04-29 14:35:14
【问题描述】:

models.py

class products(models.Model):
    name = models.CharField(max_length=100)
    sku = models.CharField(max_length=50)
    vendor = models.CharField(max_length=50)
    brand = models.CharField(max_length=50)
    price = models.FloatField()
    product_status = models.BooleanField()
    quantity = models.IntegerField()

    def __str__(self):
        return self.name


# categories
class categories(models.Model):
    category_name = models.CharField(max_length=50)
    parent_id = models.IntegerField()


# product categories
class product_categories(models.Model):
    product = models.ForeignKey(products, on_delete=models.CASCADE)
    category = models.ForeignKey(categories, on_delete=models.CASCADE)

    def __str__(self):
        return self.category
  1. 我可以使用 'category' 表数据(在 django shell 中)访问
data = products.objects.all()
data.values('product_categories__category__category_name')
output: <QuerySet [{'product_categories__category__category_name': 'xxxx'}}]>
  1. 如果我把这个(在 django shell 里面)
data.product_categories.category
output: 'QuerySet' object has no attribute 'product_categories'

如何获得一个查询集(可以传递给 html),其中包括“类别”表中的数据以及“产品”表中的数据

【问题讨论】:

  • 嗨,您不需要 3 个模型,您可以使用产品模型与类别建立很多关系,这将使查询集更容易

标签: python django django-models django-views django-queryset


【解决方案1】:

这里发生了几个问题。首先,data 是一个查询集,它有点像一个对象列表,尽管列表中只有一个对象。您想要的是从列表中的项目中获取一个属性,因此您需要像 data.first() 这样的东西来获取该对象,然后再开始添加它的属性。

其次,Django 处理反向 FK 关系的方式要求您通过标准名称(在您的情况下为 product_categories_set)引用 FK,或者您在 FK 上设置自己的 related_name 属性。比如:

# product categories
class product_categories(models.Model):
    product = models.ForeignKey(products, on_delete=models.CASCADE, related_name='product_categories')
    category = models.ForeignKey(categories, on_delete=models.CASCADE, related_name='product_categories')

    def __str__(self):
        return self.category

这样您就可以使用 data.product_categories 从产品和类别中引用您的 product_categories 模型。

第三,当访问反向FK关系时,就像上面第(1)点一样,你会得到一个相关的manager,从中你可以得到一个queryset of items。因此,要获得类别名称,您需要指明您想要类别名称的项目。假设它只是所有内容的第一项,它看起来像:

data = products.objects.all()
product_category = data.product_categories.all()
category_name = product_category.category.category_name

当然,一旦您拥有更多数据,您不会总是只想选择第一个项目,因此您需要在查询中添加过滤逻辑,以确保您获得所需的项目。

ETA,我同意上面 Jorge 的评论 - MTM 会使这更简单一些,并且本质上会为您创建您的 product_categories 表。

【讨论】:

  • 谢谢!像魅力一样工作
  • 不客气!请接受我的回答好吗?
  • 完成!我是新手?
  • 别担心!谢谢!
猜你喜欢
  • 2021-11-02
  • 2019-11-10
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多