Django json сериализатор с разными полями - PullRequest
0 голосов
/ 11 января 2020

У меня есть json {{"cosmetics":["perfume1","scent2","cream1"]},{"cosmetics":["perfume2","perfume1","cream2","cream1"]}}

И модель, в которой я должен сохранять косметику, разделенная на два поля cream и perfumes У меня есть два набора со всеми доступными духами и кремы следующим образом

PERFUME = {"prefume1", "perfume2", "scent1"}
CREAM = {"cream1", "cream2"}

Моя модель выглядит следующим образом

class X(models.Model):
    perfume = ListTextField(base_field=models.CharField(max_length=20))
    cream = ListTextField(base_field=models.CharField(max_length=20))

У меня вопрос, как написать сериализатор, чтобы сопоставить вышеуказанную модель с заданным json? (Я хочу сохранить данные из json в дБ) Заранее спасибо.

1 Ответ

0 голосов
/ 11 января 2020

Нашел это. Мне пришлось редактировать мою модель, а также сериализатор. Из сериализатора я исключил поля perfumes и cream. Добавлено поле cosmetics для модели. Изменен метод save() модели, чтобы установить значения для perfumes и cream

Мой окончательный код выглядит следующим образом

class X(models.Model):
    perfume = ListTextField(base_field=models.CharField(max_length=20))
    cream = ListTextField(base_field=models.CharField(max_length=20))
    cosmetics= ListTextField(base_field=models.CharField(max_length=20))
    def save(self, *args, **kwargs):
        self.perfume= list(set(self.cosmetics) & PERFUMES)
        self.vegetables = list(set(self.cosmetics) & CREAMS)
        super(X, self).save(*args, **kwargs)

Serializer.py выглядит следующим образом

class StringListField(serializers.ListField):  # to save a list field
   child = serializers.CharField()

class XSerializer(serializer.(serializers.ModelSerializer):
    cosmetics= StringListField()
    class Meta:
        model = X
        exclude = ("perfume", "cream")
...