【问题标题】:Django - ManyToMany - how to filter on parent's ManyToMany objectDjango - ManyToMany - 如何过滤父对象的 ManyToMany
【发布时间】:2020-12-24 01:24:02
【问题描述】:

在我的查询集模型上编写过滤器时遇到问题:

class Order(models.Model):
  items = models.ManyToManyField(OrderLine)
  store = models.ForeignKey(Store, blank=True, null=True, on_delete=models.SET_NULL)

class OrderLine(models.Model):
  orderItemId = models.IntegerField(blank=False, null=False, unique=True)
  quantity = models.IntegerField(blank=True, null=True)

class Store(models.Model):
  storeName = models.CharField(max_length=200, blank=True, null=True)
  access_from_account = models.ManyToManyField(EDUser, blank=True)

我有 EDUser "accounts" 的查询集 现在我想选择属于 Order 的 OrderLines,这些 OrderLines 来自于 access_from _account 中的帐户可见的 Store。

所以,例如:

store_name_1 拥有 access_from_account 用户_1、用户_2

store_name_2 拥有 access_from_account user_1

Orders 上属于 store_name_1。这些订单有许多 OrderLines。 我想选择 user_1 应该可以访问的 order_lines。

我可以这样做吗: acounts 是 ['user_1'] 的查询集

lines = OrderLine.objects.filter(order__store__access_from_account__in=accounts)? 我试过了,但我得到了一些奇怪的值......

关于如何正确执行的任何建议?我想避免制作列表并对其进行迭代。

提前致谢:)

【问题讨论】:

  • 你不需要 __in 查找,所以 lines = OrderLine.objects.filter(order__store__access_from_account=user1) 就足够了,究竟什么是“奇怪的值”?
  • 所以,对于我有几行的商店之一,我得到的结果就像我有几百行一样。但是你的回答解决了我的问题。祝福.distinct() :)

标签: django django-models django-views


【解决方案1】:

查询

lines = OrderLine.objects.filter(
    order__store__access_from_account__in=accounts
)

将正常工作。唯一的问题是,如果accounts 包含两个用户,例如user1user2,并且两个帐户都可以访问商店,则会重复这些行。因此,您将为user1user2 检索OrderLines。这是由于两者之间的联结表上的LEFT OUTER JOIN。你可以使用.distinct() [Django-doc]来解决这个问题:

lines = OrderLine.objects.filter(
    order__store__access_from_account__in=accounts
).distinct()

如果您使用单个EDUser,则不需要__in 查找:

# for a single user

lines = OrderLine.objects.filter(
    order__store__access_from_account=myuser
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2021-06-07
    • 2014-02-03
    相关资源
    最近更新 更多