Django сохранить значение по умолчанию в Proxy Model - PullRequest
1 голос
/ 25 марта 2020

Различные модели прокси должны отличаться по типу. Если я запрашиваю эти модели, то получаю правильные.

Я пытаюсь сохранить поле типа по умолчанию в прокси-модели. Я не хочу устанавливать его каждый раз в представлении.

Это не работает. Поле типа всегда "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

Обновление 25.02.2020 12: 18:

Я обнаружил, что это устанавливает правильный тип. Но я не знаю, как использовать create () в ModelForm.

class Type2Manager(models.Manager):

    ...

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

1 Ответ

1 голос
/ 25 марта 2020

Менеджер моделей работает на «уровне таблицы». Когда вы создаете объект через форму, он использует объекты модели, а не менеджер модели, и, таким образом, вам необходимо переопределить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...