0

让我们考虑一下我有一群人拥有一些衬衫的情况:

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_setthe_person.shirts),但是the_photo.shirt由于 id 为 None (或 0),它变得越来越难看,而且看起来它需要一堆丑陋的黑客来适应它。

但也许我做错了?有任何想法吗?最优雅和最pythonic的方法是什么?

4

0 回答 0