Django - ManyToMany - 如何过滤父对象的 ManyToMany 对象



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

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">帐户";现在,我想选择属于订单的OrderLines,这些订单来自access_from_account中的帐户可见的Store。

例如:

store_name_1具有access_from_accountuser_1,user_2

store_name_2具有access_from_accountuser_1

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

我可以通过以下方式完成吗:acounts是['user_1']的查询集

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

有没有关于如何正确地做这件事的建议?我希望避免列出列表并对其进行迭代。

提前感谢:(

查询

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

将正常工作。唯一的问题是,如果accounts包含两个用户,如user1user2,并且两个帐户都可以访问一个存储,则会重复行。因此,您将检索user1user2OrderLines。这是由于中间连接表上的LEFT OUTER JOIN。您可以使用.distinct()[Django-doc]:来解决此问题

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

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

# for asingleuser
lines = OrderLine.objects.filter(
order__store__access_from_account=myuser
)

最新更新