考虑以下django模型设置:
from django.db import models
class Foo(models.Model):
field_foo = models.CharField(max_length=20,
null=False,
blank=False,
unique=True,)
class Bar(models.Model):
field_bar = models.CharField(max_length=20,
null=False,
blank=False,
unique=True,)
class Foobar(models.Model):
field_foo = models.ForeignKey(foo,on_delete=models.CASCADE)
field_bar = models.ForeignKey(bar,on_delete=models.CASCADE)
我想查找两行具有相同的field_foo
和field_bar
值。我可以手动完成,但我想知道django是否有一个功能可以解决这个问题。我现在这样做的方法是:
for f in Foo.objects.all():
for b in Bar.objects.all():
fb = Foobar.objects.filter(foo=f, bar=b)
if len(fb)>2:
something='do'
3条答案
按热度按时间3zwjbxry1#
可以同时使用annotate()和filter()方法来过滤具有相同Foo和Bar示例作为关系的FooBar示例。
给予这个
输出
测试型号
57hvy0tb2#
你的手工方式也是低效的。你可以通过使用以下命令在O(n)内完成:
你也可以尝试使用一些花哨的查询来实现这一点。Django select only rows with duplicate field values
1cklez4t3#
假设你的问题中有一个错别字(有一个
f
而不是b
,你想要的是任何对f
,b
的fb = Foobar.objects.filter(foo=f, bar=b)
的替代品),这里有一个提示:实际上,最佳的方法将取决于你想达到什么。
(1)如果你想知道每对值
f
,b
有多少个Foobar
示例:(2)或者,如果您想检索所有对应的示例,可以执行以下操作:
也许有一种方法可以使用子查询来做同样的事情,看看文档。