【发布时间】:2015-05-26 14:18:37
【问题描述】:
使用 ORM 应该不会太难;使用原始 SQL 非常简单。
我有一些模型:
class Actor(models.Model):
last_name = models.CharField(max_length=64)
specialty = models.ManyToManyField(Specialty, blank=True)
allergy = models.ManyToManyField(Allergy, blank=True)
#.... TONS MORE M2Ms HERE ....#
class Character(models.Model):
actor = models.ForeignKey(Actor)
name = models.CharField(max_length=64, null=True)
我相信这是正确的建模方式,因为一个演员可以扮演多个角色,但在大多数情况下,情况并非如此,例如:
m = Actor(last_name='Palin')
d = Character(actor=m, name='Dennis')
r = Character(actor=m, name='Right Head')
如果我想显示所有演员的列表,并获取他们所有的 m2m 关系,这很简单:
actors = Actor.objects.all().prefetch_related(specialty, allergy, ...)
有一系列非常复杂的过滤器可以根据用户输入应用于上述查询集,例如actors allergic to peanuts but not allergic to filth。
现在,如果我想获得相同的查询集,按不同的角色名称排序,我知道的唯一方法是查询角色,选择相关的演员,并预取相关的 m2ms。
不幸的是,这将需要我重新编写所有过滤器。因为allergy__name='peanuts' 必须变成actor__allergy__name='peanuts'。
答案是什么?我如何以DRY最可能的方式提供“按演员排序”和“按角色排序”?
【问题讨论】:
标签: django many-to-many django-queryset