使用这样的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变量(比如视频模型的'视频')。所以我不能正常地做到这一点。
答案 0 :(得分:2)
因为Django ORM代码在类定义期间做了一些严重的元魔术(只需浏览django / db代码就可以看到魔法)。通过在__init __()函数中动态创建字段,您正在围绕该魔法进行最终运行。
是否存在以正常方式创建课程的良好原因?如果没有,那么按照正常方式进行。如果您做有充分的理由,那么请准备好进入池中的真正的深层 - Python和Django。
答案 1 :(得分:1)
为upload_to
属性设置动态路径绝对不是想要模拟字段声明的好理由。
这是Django已经处理的东西 - 如果将upload_to
设置为可调用,则可以返回依赖于模型实例的正确值。请参阅the documentation。