【问题标题】:django not taking in consideration model fields declared in __init__django 没有考虑在 __init__ 中声明的模型字段
【发布时间】:2011-04-09 12:15:28
【问题描述】:

当像这样使用模型类时:

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) 如您所见,在每个子类中,我必须使用适当的 upload_to 变量调用父 init 方法(对视频模型说“视频”)。所以我不能以正常的方式做到这一点。

【问题讨论】:

    标签: django model field


    【解决方案1】:

    因为 Django ORM 代码在类定义期间做了一些严重的元魔法(只需浏览 django/db 代码,看看它有多么神奇)。您正在通过在 __init__() 函数中动态创建字段来完成该魔术。

    真的有的理由不以正常方式创建类吗?如果没有,那么按照正常方式进行。如果您确实有充分的理由,那么请准备好进入真正池的最深处——Python 和 Django。

    【讨论】:

      【解决方案2】:

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

      这是 Django 已经处理的事情 - 如果您将 upload_to 设置为可调用对象,您可以根据模型实例返回正确的值。见the documentation

      【讨论】:

      • 这似乎是正确的解决方案,但我不知道如何调用子回调,因为这不起作用:file = models.FileField(upload_to=UploadItem.get_directory)
      • 为什么不起作用?上传文件时调用回调。如果您对此功能有特定的问题,请打开一个新问题。
      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 2020-08-17
      • 2019-07-22
      • 2021-07-26
      • 2011-09-17
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多