Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型降序/嵌套查询_Python_Django_Django Models_Django Queryset - Fatal编程技术网

Python Django模型降序/嵌套查询

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."

我很难理解如何使用Django中的表/模型结构来执行有用的查询

我想做的是:给定Show对象的主键,获取Show中所有字符的集合。

我的模型如下:

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.以某种方式,场景中的角色和位置字段仅允许从附加到场景所在的显示的位置/角色中进行选择。这可能吗?我对实施您的建议的关注是,多个字段意味着一个角色可以出现在多个节目中,这可能会在将来引起问题。我想确保指向该剧的角色集与该剧场景中的角色集相同。