Django为特定外键选择具有重复字段值的行

Django为特定外键选择具有重复字段值的行,django,django-models,Django,Django Models,我想在我的模型中搜索重复项,但现在情况略有不同 以下是我的模型: class Concept(models.Model): main_name = models.ForeignKey(Literal) ... class Literal(models.Model): name = models.Charfield(...) concept = models.ForeignKey(Concept) ... 现在我要完成的任务是: 选择所有非主_名称的文字,

我想在我的模型中搜索重复项,但现在情况略有不同

以下是我的模型:

class Concept(models.Model):
    main_name = models.ForeignKey(Literal)
    ...
class Literal(models.Model):
    name = models.Charfield(...)
    concept = models.ForeignKey(Concept)
    ...
现在我要完成的任务是: 选择所有非主_名称的文字,这些文字对于同一概念具有相同的名称

例如,如果我有文字:

[{id:1, name:'test', concept:1}, {id:2, name:'test', concept:1}]
和概念:

[{id:1, main_name:1}]

然后在结果中,我应该得到ID=2的文本。

如果我理解您想要的问题:

所有非外来概念的文字对象。 从该集合中,选择名称和概念相同的集合。 如果是这样的话,我认为这应该是可行的:

第一部分:

q = Literal.objects.exclude(pk__in=Concept.objects.values_list('id', flat=True))
编辑:


基于Jan的优秀反馈,我认为对于2,您需要使用。

我觉得您似乎想要执行类似以下内容的SQL查询:

SELECT l1.* FROM myapp_literal AS l1,
                 myapp_literal AS l2
WHERE l1.id <> l2.id
  AND l1.name = l2.name
  AND l1.concept = l2.concept
  AND l1.id NOT IN (SELECT main_name FROM myapp_concept)
GROUP BY l1.id

好吧,如果查询太复杂,无法用Django的查询语言轻松表达,您可以-这可能是其中之一。

应该是值列表,我认为您的第二部分没有任何作用。你是说q.filtername=F'concept\uuu main\u name\uuu name'?不过,我不确定这在性能上是否最佳。老实说,我不确定性能部分;但根据我对文档的理解,我认为F表达式是正确的。感谢编辑的values_列表。它不只是测试文本的名称是否等于它自己的名称吗?对于概念,这当然适用于所有文本?好的。我在我的评论中发布了一个可能的解决方案,认为它确实有效,不使用原始SQL而是外键查找。是的,我知道必须选择所有非主文本,这相当简单,我的指令是如何执行整个任务。不管怎样,谢谢你的帮助。是的,我想我给出了我想要的,除了你需要指定l1.id而不是l1.*,否则它将是列,必须出现在GROUP BY子句中或用于聚合函数。你能告诉我应该写什么吗?删除从l1中选择的所有内容吗?我想我太习惯MySQL了,这是一个。您很正确地指出,在大多数数据库中,这是不允许的。要删除与查询匹配的记录,您可以在查询上执行。类似于Literal.objects.raw'SELECT…'。delete,但请注意,我编写的查询会选择所有具有重复项的记录,您可能希望删除所有记录,但每个匹配集中只有一个除外。