我無法理解如何使用 Django 中的表/模型結構來執行有用的查詢。我想做的是:給定 Show 對象的主鍵,獲取演出中所有字符的集合。我的模型如下:class Location(models.Model): identifier = models.CharField(max_length=200) def __str__(self): """String for representing the Model object.""" return self.identifierclass Character(models.Model): identifier = models.CharField(max_length=200) def __str__(self): """String for representing the Model object.""" return self.identifierclass 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.shorthandclass 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))這看起來很基本,但我還沒有破解如何通過外鍵回溯或其他方法來下降模型。我嘗試過使用prefetch_lated但我想我對什么是 QuerySet 與對象感到困惑。我因需要執行的降序調用數量而推遲,Django 中肯定有更緊湊/簡潔的方法嗎?我還考慮過向角色模型添加外鍵,但很確定我最終會遇到同樣的問題。
1 回答

一只名叫tom的貓
TA貢獻1906條經驗 獲得超3個贊
使用您擁有的模型,您需要將過濾器中的多個查找鏈接在一起:
characters = Character.objects.filter(scenes__episode__season__show_id=show_id)
話雖這么說,我建議稍微修改一下您的架構,因為這個查詢非常昂貴。
如果您將 a 添加ManyToManyField到Show模型(并填充表),則會將此查詢轉換為簡單的M2M查找:
class Show(models.Model):
characters = models.ManyToManyField(Character)
...
characters = Show.objects.get(id=show_id).characters.all()
對于 而言prefetch_related,它只是一種防止多次數據庫命中的優化。
第一個查詢分別訪問數據庫 4 次,但如果添加預?。?/p>
characters = Character.objects.prefetch_related(
'scenes', 'episode', 'season', 'show'
).filter(scenes__episode__season__show_id=show_id)
它只訪問數據庫一次,并在 python 中完成所有連接。
添加回答
舉報
0/150
提交
取消