我的模型Painting
和Hit
中有两个类。
class Painting(models.Model):
objectNumber = models.CharField(max_length=128)
class Hit(models.Model):
painting = models.ForeignKey(Painting)
通过这种方式,每幅画可以连接到多个点击,但每个点击只能连接到一幅画。
我希望选择与3个或更少点击相关的每幅画。我怎么能这样做?
可能的解决方案:
我想我可以做一些for循环...
for painting in Painting.objects.all():
if len(Hit.objects.filter(painting=painting)) > 4:
# and then append it to a list or something
...但我认为我可以申请一些我无法找到的原生过滤器。或者我可以在Painting
添加一个字段来计算与其相关的点击次数,但这似乎不合逻辑。
答案 0 :(得分:0)
您可以使用select_related。为此,您必须为您Hit
模型
class Hit(models.Model):
painting = models.ForeignKey(Painting, related_name='paintings')
然后在绘画模型上使用select相关
Painting.objects.all().select_related('painting')
这将为您提供查询集。现在,您可以应用len
或count
等任何操作,但现在无需循环。对于您的情况,您可以链接任何注释或过滤器来计算命中数。
注意:如果你有ManyToMany字段而不是外键字段,那么prefetch_related就可以了。
答案 1 :(得分:0)
您需要查看queryset注释。您可以为每幅绘画添加点击次数,然后根据点击次数(docs)过滤绘画。
from django.db.models import Count
Painting.objects.annotate(num_hits=Count('hit')).filter(num_hits__lte=3)