Это в некоторой степени связано с вопросом, поставленным в этом вопросе , но я пытаюсь сделать это с помощью абстрактного базового класса.
Для целей данного примера давайте используем следующие модели:
class Comic(models.Model):
name = models.CharField(max_length=20)
desc = models.CharField(max_length=100)
volume = models.IntegerField()
... <50 other things that make up a Comic>
class Meta:
abstract = True
class InkedComic(Comic):
lines = models.IntegerField()
class ColoredComic(Comic):
colored = models.BooleanField(default=False)
В представлении, скажем, мы получаем ссылку на InkedComic id
, поскольку трассировщик, я имею в виду трассировщик, завершил рисование линий, и пришло время добавить цвет. После того, как в представление добавлены все цвета, мы хотим сохранить ColoredComic
в БД.
Очевидно, мы могли бы сделать
inked = InkedComic.object.get(pk=ink_id)
colored = ColoredComic()
colored.name = inked.name
etc, etc.
Но на самом деле было бы неплохо сделать:
colored = ColoredComic(inked_comic=inked)
colored.colored = True
colored.save()
Я пытался сделать
class ColoredComic(Comic):
colored = models.BooleanField(default=False)
def __init__(self, inked_comic = False, *args, **kwargs):
super(ColoredComic, self).__init__(*args, **kwargs)
if inked_comic:
self.__dict__.update(inked_comic.__dict__)
self.__dict__.update({'id': None}) # Remove pk field value
но оказывается, что вызов ColoredComic.objects.get(pk=1)
вставляет pk
в ключевое слово inked_comic
, которое явно не предназначено. (и в действительности int
не имеет <strong>dict</strong>
исключения)
В этот момент у меня зажжен мозг, я что-то упускаю из виду или есть лучший способ сделать это?