【问题标题】:How to select all objects that aren't in a manytomany relation in Django如何在Django中选择不在多对多关系中的所有对象
【发布时间】:2011-03-18 11:36:41
【问题描述】:

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

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,然后将它们排除在过滤器中。

【问题讨论】:

    标签: python django django-admin manytomanyfield


    【解决方案1】:

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

    您可以在the documentation 中找到进一步的解释。

    【讨论】:

    • 你确定吗?我已经尝试过了,但没有运气(总是得到类似:FieldError:无法解析关键字'plan_set')。我可以以相反的方式做到这一点:Plan.objects.filter(services__isnull=True)。
    • 我现在不记得了,但您可能总是在您的 Plan 模型中提供 related_name,例如services = models.ManyToManyField('Service', related_name='plans'),然后使用Service.objects.filter(plans__isnull=True)查询服务。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2020-12-21
      • 2019-04-23
      • 2020-05-19
      相关资源
      最近更新 更多