DRF: лучший способ предоставить значение по умолчанию для поля Dynami c? - PullRequest
0 голосов
/ 30 апреля 2020

На нашем сайте SAAS используется серверная часть DRF с Vue внешним интерфейсом. У нас есть поля, которые не требуют значения от пользователя, но требуют значения в базе данных. Я хотел бы знать, где лучше всего поставить такие динамические значения по умолчанию. Я читал в других постах, что «save () не всегда вызывается» - хотя я пока не знаю обстоятельств, когда он не будет вызываться.

Итак, рассмотрим следующую модель:

class Tenant(models.Model):

    name = models.CharField(max_length=100)
    subdomain = models.CharField(max_length=100, blank=True, null=True)
    schema_name = models.CharField(max_length=63, unique=True)

В этом случае требуется только «имя» (от пользователя); «имя_схемы», если оставить его пустым в форме внешнего интерфейса, можно получить из «имени» (преобразовав его в нижний регистр). Аналогично, «поддомен» может быть получен из «имя_схемы». «subdomain» может быть пустым / пустым, поскольку схема «publi c» не ссылается на поддомен, но его значение потребуется для всех арендаторов, кроме «publi c».)

куда мне поместить код, который заполняет эти поля, если они пустые, когда приходит время создавать или обновлять Арендатора?

1 Ответ

1 голос
/ 01 мая 2020

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

Если вы хотите поместить его в сериализатор, вы можете написать что-то вроде этого, а затем использовать ModelViewSet для обработки деталей:

class TenantSerializer(ModelSerializer):
    name = CharField(required=True, min_length=1)
    sub_domain = CharField(required=False)

    class Meta:
        model = Tenant
        fields = ['id', 'name', 'sub_domain']

    def validate(self, attrs):
        # attrs is all fields parsed & validated on a per-field level
        # in here you can do validation that depends on >1 field
        # values returned will be passed to the serializer create()/update()
        # via the common serializer.save() method
        if self.instance:
            # doing an update, maybe different logic, or just ignore?
        else:
            if not attrs.get('sub_domain'): # missing or blank
                attrs['sub_domain'] = parse_subdomain(attrs.get('name'))
        return attrs    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...