Заполнение моделей из других моделей в Джанго? - PullRequest
3 голосов
/ 15 апреля 2010

Это в некоторой степени связано с вопросом, поставленным в этом вопросе , но я пытаюсь сделать это с помощью абстрактного базового класса.

Для целей данного примера давайте используем следующие модели:

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> исключения)

В этот момент у меня зажжен мозг, я что-то упускаю из виду или есть лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2010

Как насчет статического метода в классе, чтобы справиться с этим?

colored = ColoredComic.create_from_Inked(pk=ink_id)
colored.colored = True
colored.save()

Не проверено, но что-то на этот счет (используя ваш код сверху)

class ColoredComic(Comic):
    colored = models.BooleanField(default=False)

    @staticmethod
    def create_from_Inked(**kwargs):
        inked = InkedComic.objects.get(**kwargs)
        if inked:
            colored = ColoredComic.objects.create()
            colored.__dict__.update(inked.__dict__)
            colored.__dict__.update({'id': None}) # Remove pk field value
            return colored
        else:
            # or throw an exception...
            return None
0 голосов
/ 15 апреля 2010

Для этого простого случая это будет работать:

inked = InkedComic.object.get(pk=ink_id)
inked.__class__ = ColoredComic
inked.colored = True
inked.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...