django没有考虑__init__中声明的模型字段

时间:2010-09-08 01:54:40

标签: django model field

使用这样的Model类时:

class MyModel(models.Model):
    def __init__(self, *args, **kwargs):
        self.myfield = models.Field()
        super(MyModel, self).__init__(*args, **kwargs)

它不考虑myfield(在管理表单中,保存对象时......)

但如果我这样声明:

class MyModel(models.Model):
    myfield = models.Field()

它运作得很好。

为什么?

修改

我认为我有一个很好的理由:我有一个抽象类UploadItem,它定义了一个名为file的字段,如下所示:self.file = models.FileField(upload_to=upload_to)正如您所看到的,在每个子类中,我必须使用适当的方法调用父init方法upload_to变量(比如视频模型的'视频')。所以我不能正常地做到这一点。

2 个答案:

答案 0 :(得分:2)

因为Django ORM代码在类定义期间做了一些严重的元魔术(只需浏览django / db代码就可以看到魔法)。通过在__init __()函数中动态创建字段,您正在围绕该魔法进行最终运行。

是否存在以正常方式创建课程的良好原因?如果没有,那么按照正常方式进行。如果您有充分的理由,那么请准备好进入池中的真正的深层 - Python和Django。

答案 1 :(得分:1)

upload_to属性设置动态路径绝对不是想要模拟字段声明的好理由。

这是Django已经处理的东西 - 如果将upload_to设置为可调用,则可以返回依赖于模型实例的正确值。请参阅the documentation