【问题标题】:Executing Anti Join in Django ORM在 Django ORM 中执行反连接
【发布时间】:2014-10-27 22:19:21
【问题描述】:

我有两个模型:

class Note(model):
    <attribs>

class Permalink(model):
    note = foreign key to Note

我想执行一个查询:获取所有没有固定链接的笔记。 在 SQL 中,我会这样做:

SELECT * FROM Note WHERE id NOT IN (SELECT note FROM Permalink); 

想知道如何在 ORM 中做到这一点。

编辑:我不想将所有永久链接都放到我的应用程序中。而是希望它在数据库中作为查询运行。

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    你应该可以使用这个查询:

    Note.objects.filter(permalink_set__isnull=True)
    

    【讨论】:

    • 你能告诉我 permalink_set 是什么吗?我在 shell 中运行了它,但它不起作用。
    • @AnilShanbhag:它是永久链接外键的相关名称。因此,如果您为外键设置相关名称,请使用该名称。
    • @AnilShanbhag 如果related_name 设置为note = models.ForeignKey('Note', related_name='permalinks') 所以它应该是Note.objects.filter(permalinks__isnull=True)
    【解决方案2】:

    你可以使用:

     Note.objects.exclude(id__in=Permalink.objects.all().values_list('id', flat=True))
    

    【讨论】:

    • 这是一种奇怪的慢方法
    • 我只是发布另一种方法
    • 我刚刚评论了它
    • 小修正,应该是.values_list('note', flat=True)。或者 .values('note') 也可以。
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2020-05-18
    • 2014-02-16
    • 2015-02-15
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多