Django 在代理模型中保存默认值

mor*_*z_h 3 python django django-models

不同的代理模型应该是不同的类型。如果我查询这些模型,我就是正确的模型。

我正在尝试在代理模型中保存默认类型字段。我不想每次都在视图中设置它。

这不起作用。类型字段始终为“TYPE1”。

模型.py:

class MyModel(models.Model):

    class ModelType(models.TextChoices):
        TYPE1 = 'TYPE1', _('TYPE1')
        TYPE2 = 'TYPE2', _('TYPE2')

    type = models.CharField(max_length=100, choices=ModelType.choices, default='TYPE1')


class Type2Manager(models.Manager):

    def get_queryset(self):
        return super(Type2Manager, self).get_queryset().filter(type='TYPE2')

    def save(self, *args, **kwargs):
        kwargs.update({'type': 'TYPE2'})
        return super(Type2Manager, self).save(*args, **kwargs)


class Type2ProxyModel(MyModel):
    class Meta:
        proxy = True

    objects = Type2Manager()

Run Code Online (Sandbox Code Playgroud)

视图.py:

def create_type2_model(request):
    form = Type2Form(request.POST, initial={})
    f = form.save(commit=False) 
    f.save()    

Run Code Online (Sandbox Code Playgroud)

表格.py:

class Type2Form(ModelForm):

    class Meta:
        model = Type2ProxyModel

Run Code Online (Sandbox Code Playgroud)

25.02.2020 12:18 更新:

我发现这设置了正确的类型。但是我不知道如何在 ModelForm 中使用 create() 。

class Type2Manager(models.Manager):

    ...

    def create(self, **kwargs):
        kwargs.update({'type': 'TYPE2'})
        return super(Type2Manager, self).create(**kwargs)
Run Code Online (Sandbox Code Playgroud)
Type2ProxyModel.objects.create()
Run Code Online (Sandbox Code Playgroud)

yve*_*ine 6

模型管理器在“表级别”上运行。当您通过表单创建对象时,它使用模型对象而不是模型管理器,因此您需要覆盖save代理模型的 。如果我将您修改Type2ProxyModel为此,它会起作用:

class Type2ProxyModel(MyModel):
    class Meta:
        proxy = True

    objects = Type2Manager()

    def save(self, *args, **kwargs):
        self.type = 'TYPE2'
        return super(Type2ProxyModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)