Python Django模型降序/嵌套查询
我很难理解如何使用Django中的表/模型结构来执行有用的查询 我想做的是:给定Show对象的主键,获取Show中所有字符的集合。 我的模型如下:Python Django模型降序/嵌套查询,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我很难理解如何使用Django中的表/模型结构来执行有用的查询 我想做的是:给定Show对象的主键,获取Show中所有字符的集合。 我的模型如下: class Location(models.Model): identifier = models.CharField(max_length=200) def __str__(self): """String for representing the Model object."
class Location(models.Model):
identifier = models.CharField(max_length=200)
def __str__(self):
"""String for representing the Model object."""
return self.identifier
class Character(models.Model):
identifier = models.CharField(max_length=200)
def __str__(self):
"""String for representing the Model object."""
return self.identifier
class Show(models.Model):
name = models.CharField(max_length=200)
shorthand = models.CharField(max_length=2, unique=True)
def __str__(self):
"""String for representing the Model object."""
return self.shorthand
class Season(models.Model):
number = models.IntegerField()
show = models.ForeignKey(Show, on_delete=models.SET_NULL, null=True, related_name="seasons")
class Meta:
unique_together = (("number", "show"))
def __str__(self):
"""String for representing the Model object."""
return (str(self.show) + "s" + str(self.number))
class Episode(models.Model):
number = models.IntegerField()
season = models.ForeignKey(Season, on_delete=models.SET_NULL, null=True, related_name="episodes")
class Meta:
unique_together = (("number", "season"))
def __str__(self):
"""String for representing the Model object."""
return (str(self.season) + "ep" + str(self.number))
class Scene(models.Model):
number = models.IntegerField()
character = models.ManyToManyField(Character, related_name="scenes")
location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True, related_name="scenes")
episode = models.ForeignKey(Episode, on_delete=models.SET_NULL, null=True, related_name="scenes")
class Meta:
unique_together = (("number", "episode"))
def __str__(self):
"""String for representing the Model object."""
return (str(self.episode) + "sc" + str(self.number))
这似乎足够基本,但我还没有破解如何通过外键回溯或其他方法降低模型。我尝试过使用QuerySet,但我想我对QuerySet和object的区别感到困惑。我被我需要做的降序呼叫的数量吓坏了,Django中肯定有更简洁的方法吗?我也考虑过在角色模型中添加外键,但我很确定最终也会遇到同样的问题
如有任何帮助/建议,将不胜感激 使用现有的模型,您需要将过滤器中的几个查找链接在一起:
characters = Character.objects.filter(scenes__episode__season__show_id=show_id)
也就是说,我建议稍微修改一下您的模式,因为这个查询非常昂贵
如果将ManyToManyField
添加到Show
模型中(并填充表格),它会将此查询变成一个简单的M2M查找:
class Show(models.Model):
characters = models.ManyToManyField(Character)
...
characters = Show.objects.get(id=show_id).characters.all()
对于与预取相关的,它只是一种防止多个数据库命中的优化
第一个查询分别命中数据库4次,但如果添加一个预回迁:
characters = Character.objects.prefetch_related(
'scenes', 'episode', 'season', 'show'
).filter(scenes__episode__season__show_id=show_id)
它只命中数据库一次,并在python中执行所有连接操作。以下方法是否更好:1。将外键字段添加到指向显示的字符和位置。2.以某种方式,场景中的角色和位置字段仅允许从附加到场景所在的显示的位置/角色中进行选择。这可能吗?我对实施您的建议的关注是,多个字段意味着一个角色可以出现在多个节目中,这可能会在将来引起问题。我想确保指向该剧的角色集与该剧场景中的角色集相同。