【问题标题】:Populating Models from other Models in Django?从 Django 中的其他模型填充模型?
【发布时间】:2010-04-14 20:44:09
【问题描述】:

这与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 没有<strong>dict</strong> 异常)

此时我的大脑被炸了,我是否遗漏了一些明显的东西,还是有更好的方法来做到这一点?

【问题讨论】:

    标签: python django inheritance django-models


    【解决方案1】:

    类上的静态方法如何处理这个问题?

    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
    

    【讨论】:

    • 对此进行测试,我唯一需要更改的是将 ColoredComic.objects.create() 更改为 ColoredComic() 因为那时我只想处理该模型的本地副本(更多业务逻辑在我的情况下保存之前需要。)我现在可以回去工作了!谢谢!
    【解决方案2】:

    对于这种简单的情况,这将起作用:

    inked = InkedComic.object.get(pk=ink_id)
    inked.__class__ = ColoredComic
    inked.colored = True
    inked.save()
    

    【讨论】:

    • 我实际上是从这样的东西开始的,但是如果你像这样更改类,你不会在着墨项目上获得所有 ColoredComic 属性,所以 save() 失败。在示例中,您通过执行 inked.colored = True 解决了这个问题,但是随着子类属性数量的增加,这变得很痛苦。 (我的实际问题有六个额外的属性,其中大多数是默认的或可选的)但是对于这个简单的例子来说是的,因为这确实有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2020-05-10
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多