让我们考虑一下我有一群人拥有一些衬衫的情况:
class Person(models.Model):
name = models.CharField()
class Shirt(models.Model):
description = models.CharField()
owner = models.ForeignKey(Person)
我穿着他们的一件衬衫给他们拍照:
class Photo(models.Model):
person = models.ForeignKey(Person)
shirt = models.ForeignKey(Shirt)
在模板中,我使用类似的东西
{{ the_photo.shirt.description }}
和
{% for shirt in the_person.shirt_set.all %}
{{ shirt.description }}
{% endfor %}
我也有表格让我从模特的库存中挑选一件衬衫来拍照。
现在,一个转折!我也可以不穿衬衫给他们拍照!所以我想在他们可能拥有的任何衬衫之外the_person.shirt_set
包含一个description='topless'
条目。我宁愿不'topless'
为每个人存储额外的衬衫,也不希望必须修改每个表单和列表来添加此选项。
我有一个创建Topless
类的想法:
class Topless(Shirt):
def __init__(self, *args, **kwargs):
super(Topless, self).__init__(*args, **kwargs)
self.description = 'Topless'
并将其添加到列表中:
class Person(models.Model):
name = models.CharField()
def shirts(self):
l = list(Shirt.objects.filter(owner=self))
l.insert(0, Topless())
return l
(当然还有从模板切换the_person.shirt_set
到the_person.shirts
),但是the_photo.shirt
由于 id 为 None (或 0),它变得越来越难看,而且看起来它需要一堆丑陋的黑客来适应它。
但也许我做错了?有任何想法吗?最优雅和最pythonic的方法是什么?