这在某种程度上与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