gpt4 book ai didi

sql - 如何过滤 Django 模型以仅包含出现在子表(带有外键)中的模型?

转载 作者:行者123 更新时间:2023-11-29 13:13:32 25 4
gpt4 key购买 nike

我有这两个 Django 模型:

class Animals(models.Model):
id = models.AutoField(primary_key=True)
name = models.TextField(unique=True)
class Meta:
db_table = 'animals'

class AnimalSounds(models.Model):
id = models.AutoField(primary_key=True)
animal = models.ForeignKey(Animal, on_delete=models.PROTECT)
sound = models.TextField(unique=True)
class Meta:
db_table = 'animal_sounds'

现在我的 SQL 查询看起来像这样:

SELECT * FROM animals WHERE animals.id IN (
SELECT animal_id FROM animal_sounds
)

我如何使用 Django 模型执行此操作?概念上是这样的:

Animals.objects.filter(id__in=AnimalSounds.objects.all('ids'))

最佳答案

您可以检查是否至少有一个 AnimalSound 与:

Animal.objects.filter(<b>animalsounds__isnull=False</b>).distinct()

这将执行如下查询:

SELECT DISTINCT animal.*
FROM animal AS ani
JOIN animalsounds AS ans ON ans.animal_id = ani.id

或者您可以将您的方法用于:

Animals.objects.filter(
<b>id__in=AnimalSounds.objects.values('animal_id', flat=True)</b>
)

但我更喜欢前者,因为它更具声明性且更短。

编辑:如果您想选择具有相关AnimalSounds 对象的所有 Animal,其中sound'woof',你可以这样写:

# animals that produce woof (and perhaps other sounds)
Animal.objects.filter(<b>animalsounds__sound='woof'</b>).distinct()

关于sql - 如何过滤 Django 模型以仅包含出现在子表(带有外键)中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813176/

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