第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Django 模型降序/嵌套查詢

Django 模型降序/嵌套查詢

繁星coding 2023-12-09 17:20:20
我無法理解如何使用 Django 中的表/模型結(jié)構(gòu)來執(zhí)行有用的查詢。我想做的是:給定 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 與對象感到困惑。我因需要執(zhí)行的降序調(diào)用數(shù)量而推遲,Django 中肯定有更緊湊/簡潔的方法嗎?我還考慮過向角色模型添加外鍵,但很確定我最終會遇到同樣的問題。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

使用您擁有的模型,您需要將過濾器中的多個(gè)查找鏈接在一起:


characters = Character.objects.filter(scenes__episode__season__show_id=show_id)

話雖這么說,我建議稍微修改一下您的架構(gòu),因?yàn)檫@個(gè)查詢非常昂貴。


如果您將 a 添加ManyToManyField到Show模型(并填充表),則會將此查詢轉(zhuǎn)換為簡單的M2M查找:


class Show(models.Model):

    characters = models.ManyToManyField(Character)

    ...


characters = Show.objects.get(id=show_id).characters.all()

對于 而言prefetch_related,它只是一種防止多次數(shù)據(jù)庫命中的優(yōu)化。


第一個(gè)查詢分別訪問數(shù)據(jù)庫 4 次,但如果添加預(yù)?。?/p>


characters = Character.objects.prefetch_related(

    'scenes', 'episode', 'season', 'show'

).filter(scenes__episode__season__show_id=show_id)

它只訪問數(shù)據(jù)庫一次,并在 python 中完成所有連接。


查看完整回答
反對 回復(fù) 2023-12-09
  • 1 回答
  • 0 關(guān)注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號