Django save default value in Proxy Model

瘦欲@ 提交于 2021-01-27 14:32:57

问题


Different proxy models should be different in type. If I query those models I the right ones.

I am trying to save a default type field in a proxy model. I don't want to set it everytime in the view.

This does not work. The type field is always "TYPE1".

models.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()

views.py:

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

forms.py:

class Type2Form(ModelForm):

    class Meta:
        model = Type2ProxyModel

Update 25.02.2020 12:18:

I found out that this sets the correct type. But I don't know how to use create() in a ModelForm.

class Type2Manager(models.Manager):

    ...

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

回答1:


A model manager operates on a "table-level". When you create an object via a form it uses the model objects and not the model manager and thus you'd need to override the save of your proxy model. If I modify your Type2ProxyModel to this it works:

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

    objects = Type2Manager()

    def save(self, *args, **kwargs):
        self.type = 'TYPE2'
        return super(Type2ProxyModel, self).save(*args, **kwargs)


来源:https://stackoverflow.com/questions/60847167/django-save-default-value-in-proxy-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!