【问题标题】:How do I query objects of a ManyToManyField?(without through)如何查询 ManyToManyField 的对象?(不通过)
【发布时间】:2016-02-05 16:39:48
【问题描述】:

下面给出的是零售店的模型。

class Rack(models.Model):
    name = models.CharField(max_length=128)
    number = models.PositiveSmallIntegerField()
    categories = models.ManyToManyField(Category)


class Category(models.Model):
    name = models.CharField(max_length=128)
    code = models.CharField(max_length=3)


class Product(models.Model):
    title = models.CharField(max_length=255)
    in_stock = models.BooleanField(default=False)
    categories = models.ManyToManyField(Category)

机架:存放产品的机架。 类别:产品的类别。 产品:产品

一个机架可以有多个类别,同一类别可以在多个机架上。 为了便于管理,我更喜欢在管理员的机架上选择类别,所以更喜欢这种设计。

如果给定一个货架,比如说No.1,我如何查询给定货架上的产品?

>> Rack.objects.get(number=1).categories.all()

[<Category: Fruits>, <Category: Vegetables>]

我不想迭代这个查询集,而是进行查询以返回对象。

我的问题是,我如何查询机架上的对象尽可能优化

因此查询必须返回对象列表。

>> Rack.objects.filter( * code here to get the objects in the rack 1 * ) must returns the objects on the rack 1
[<Product: Apple>, <Product: Orange>, <Product: Cucumber>, <Product: Carrot>, <Product: Green Chillie>, <Product: Onion>, <Product: Grapes> ]

谢谢

【问题讨论】:

标签: python django django-queryset django-orm manytomanyfield


【解决方案1】:

您最好的选择可能是使用through model。如果你不想这样做,我会尝试这样的:

categories = Rack.objects.get(number=1).categories.all().values_list('name', flat=True)
Product.objects.filter(categories__name__in=categories)

另外,你的意思是:

class Product(models.Model):
    ...
    Category = models.ManyToManyField(Category)

成为:

class Product(models.Model):
    ...
    categories = models.ManyToManyField(Category)

喜欢你的Rack 模型吗?

【讨论】:

  • 是的,它是categories,这可以通过一个查询而不是两个查询来完成吗?
  • 感谢您的回答。如果没有找到更优化的答案,将接受。
猜你喜欢
  • 2021-06-03
  • 2010-12-22
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多