python-从Django中的其他模型填充模型?

这在某种程度上与this question中提出的问题有关,但是我正在尝试使用抽象基类来实现.

出于本示例的目的,让我们使用以下模型:

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的引用,因为示踪剂,呃,我是说,inker已经完成了线条的绘制,是时候添加颜色了.视图添加完所有颜色后,我们要将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没有dict异常)

此时,我的大脑已经炸了,我是否缺少明显的东西,还是有更好的方法来做到这一点?

解决方法:

在类上处理此问题的静态方法呢?

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
上一篇:还原 | revert (Cascading & Inheritance) - CSS 中文开发手册 - Break易站


下一篇:面向对象之:继承(inheritance)