gpt4 book ai didi

python - 最有效的 Django 查询返回跨多个表的结果

转载 作者:太空狗 更新时间:2023-10-30 02:05:05 24 4
gpt4 key购买 nike

我正在尝试以最有效的方式在 Django 中执行一个非常复杂的查询,但我不确定如何开始。我有这些模型(这是简化版)

class Status(models.Model):
status = models.CharField(max_length=200)

class User(models.Model):
name = models.CharField(max_length=200)

class Event(models.Model):
user = models.ForeignKey(User)

class EventItem(models.Model):
event = models.ForeignKey(Event)
rev1 = models.ForeignKey(Status, related_name='rev1', blank=True, null=True)
rev2 = models.ForeignKey(Status, related_name='rev2', blank=True, null=True)
active = models.BooleanField()

我想创建一个查询,该查询将生成一个用户列表,这些用户具有最多的事件,其中所有相关的 EventItem 都具有 rev1rev2 不为空或nulland active = True.

我知道我可以通过遍历用户列表然后检查他们的所有事件以匹配 rev1rev2active criteria 然后返回那些事件,但这对数据库来说很重。有什么建议吗?

谢谢!

最佳答案

您的模型已损坏,但这应该以更清晰的方式总结您所做的事情。

class Status(models.Model):
status = models.CharField(max_length=200)

class User(models.Model):
name = models.CharField(max_length=200)
events = models.ManyToManyField('Event')

class Event(models.Model):
rev1 = models.ForeignKey(Status, related_name='rev1', blank=True, null=True)
rev2 = models.ForeignKey(Status, related_name='rev2', blank=True, null=True)
active = models.BooleanField()

和查询

User.objects.filter(events__active=True).exclude(Q(events__rev1=None)|Q(events__rev2=None)).annotate(num_events=Count('events')).order_by('- num_events')

这将返回一个用户列表,按其集合中的事件数排序。

有关更多信息,请查看 Many-To-Many字段。

关于python - 最有效的 Django 查询返回跨多个表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15105202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com