如何在 Django 中选择不属于多对多关系的所有对象

发布于 2024-10-23 23:50:34 字数 607 浏览 1 评论 0原文

我在应用程序中有以下模型(已恢复):

class Account(models.Model):
    name = models.CharField(max_length=64)
    plans = models.ManyToManyField('Plan')
    extra_services = models.ManyToManyField('Service')

class Plan(models.Model):
    name = models.CharField(max_length=64)
    services = models.ManyToManyField('Service')

class Service(models.Model):
    name = models.CharField(max_length=64)

这里的计划只是服务的聚合,但帐户可能有单独的服务。在管理(帐户)中我想显示一个选择框,其中包含不与任何计划绑定的所有服务(extra_services)。我可以用来获取此信息的最佳查询集是什么(在 limit_choices_to 中)?

PS:我不想迭代所有计划来获取所有链接的服务 ID,然后将它们排除在过滤器中。

I have the following models (resumed) in an application:

class Account(models.Model):
    name = models.CharField(max_length=64)
    plans = models.ManyToManyField('Plan')
    extra_services = models.ManyToManyField('Service')

class Plan(models.Model):
    name = models.CharField(max_length=64)
    services = models.ManyToManyField('Service')

class Service(models.Model):
    name = models.CharField(max_length=64)

Plan here is just an aggregation of services, but an account may have separate services. In admin (Account) I want to show a select box with all Services (extra_services) that AREN'T TIED with any Plan. What's the best queryset I can use to get this (in limit_choices_to)?

PS: I don't want to iterate over all Plans to get all the Services ids that are linked and after that exclude them in a filter.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青衫负雪 2024-10-30 23:50:34

Service.objects.filter(plan_set__isnull=True) 应该可以。

您可以在文档中找到更多说明。

Service.objects.filter(plan_set__isnull=True) should do.

You may find further explanation in the documentation.

雨后咖啡店 2024-10-30 23:50:34

好的,我使用原始 SQL 查询得到了这个:

services = Service.objects.raw('SELECT * FROM accounts_service WHERE id NOT IN(SELECT service_id FROM accounts_plan_services);')

无论如何,我可以在没有原始 SQL 查询的情况下执行此操作吗?

OK, I got this using a raw SQL query:

services = Service.objects.raw('SELECT * FROM accounts_service WHERE id NOT IN(SELECT service_id FROM accounts_plan_services);')

Anyway, can I do this without a raw SQL query?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文