Django 使用给定的过滤多对多模型的 JSON 字段
Django filter many to many model's JSON field with the given
我有电影和参与者模型,它是这样的,
class Movie(models.Model):
something something
participants = models.ManyToManyField(Participant)
class Participant(models.Model):
something something
type = models.CharField(max_length=127, null=True, blank=True)
我想做的是,用给定的列表检查参与者 类型 字段,并根据它列出是否有电影。
例如,我有 type_list=["Adults", "Children", "Senior"]
,但 Movie 对象有 2 个 Participant 对象,其中一个是 type="Adults"
,另一个是 type="Children"
在示例中,我不希望显示该电影,因为它没有所有必需的参与者类型。
到目前为止我尝试了什么;
movie.participants.filter(type__in=["Adults", "Children", "Senior"])
但是,这个returns两个参与者反对
movie.participants.filter(Q(type="Adults") | Q(type="Children") | Q(type="Senior")):
这个也是returns两个参与者对象
我也不会使用 & 运算符。
我剩下的唯一想法是检查参与者的数量。查询返回两个,但我有三个参与者,所以我不能放映这部电影,但这里的问题是列表是来自前端的变量。所以我的查询和 if 语句都应该是通用的,我不知道如何同时做,而且我 %100 确定应该有最佳实践而不是这个。
我将不胜感激每一个微小的帮助,谢谢!
您可以使用 values_list
with distinct
获取所有参与者的类型,并通过遍历提供的列表将返回值与提供的 type_list 进行比较:
types_from_db = movie.participants.values_list("type", flat=True).distinct()
for movie_type in ["Adults", "Children", "Senior"]:
if movie_type not in types_from_db:
return False
return True
我有电影和参与者模型,它是这样的,
class Movie(models.Model):
something something
participants = models.ManyToManyField(Participant)
class Participant(models.Model):
something something
type = models.CharField(max_length=127, null=True, blank=True)
我想做的是,用给定的列表检查参与者 类型 字段,并根据它列出是否有电影。
例如,我有 type_list=["Adults", "Children", "Senior"]
,但 Movie 对象有 2 个 Participant 对象,其中一个是 type="Adults"
,另一个是 type="Children"
在示例中,我不希望显示该电影,因为它没有所有必需的参与者类型。
到目前为止我尝试了什么;
movie.participants.filter(type__in=["Adults", "Children", "Senior"])
但是,这个returns两个参与者反对
movie.participants.filter(Q(type="Adults") | Q(type="Children") | Q(type="Senior")):
这个也是returns两个参与者对象
我也不会使用 & 运算符。
我剩下的唯一想法是检查参与者的数量。查询返回两个,但我有三个参与者,所以我不能放映这部电影,但这里的问题是列表是来自前端的变量。所以我的查询和 if 语句都应该是通用的,我不知道如何同时做,而且我 %100 确定应该有最佳实践而不是这个。
我将不胜感激每一个微小的帮助,谢谢!
您可以使用 values_list
with distinct
获取所有参与者的类型,并通过遍历提供的列表将返回值与提供的 type_list 进行比较:
types_from_db = movie.participants.values_list("type", flat=True).distinct()
for movie_type in ["Adults", "Children", "Senior"]:
if movie_type not in types_from_db:
return False
return True