我的django序列化程序def更新应该是什么样的?

时间:2018-07-08 00:09:53

标签: django django-rest-framework

我正尝试使用其他人编写的 DRF后端来首次添加内容。我收到此错误...

django_1    | AssertionError: The `.update()` method does not support writable nested fields by default.
django_1    | Write an explicit `.update()` method for serializer `myapp.tracker.serializers.MedicationSerializer`, or set `read_only=True` on nested serializer fields.

如何编写Update方法? 我之前做过护栏,所以我熟悉这些概念吗?因此,当我在serilaizers.py中看到“创建”方法时,我认为“必须有一种在此处编写def更新的方法”,但是由于我是django的新手,所以我不知道该怎么做方法实际上应该看起来像^ _ ^。这就是我被困住的地方。

这里是我要更新的特定于模型的serializers.py,models.py和views.py代码...让我知道是否需要发布其他文件内容。

我的 def更新方法应该是什么样的?

我的serializer.py

class MedicationSerializer(serializers.HyperlinkedModelSerializer):
    cat = CatSerializer()

    class Meta:
        model = Medication
        fields = (
            'id',
            'cat',
            'name',
            'duration',
            'frequency',
            'dosage_unit',
            'dosage',
            'notes',
            'created',
            'modified',
            'showRow',
        )

    def create(self, validated_data):
        cat_data = validated_data.pop('cat')
        cat_obj = Cat.objects.get(**cat_data)
        medication = Medication.objects.create(cat=cat_obj, **validated_data)
        return medication

models.py看起来像这样

class Medication(models.Model):
    cat = models.ForeignKey(Cat, blank=True, null=True)

    name = models.CharField(max_length=100)
    duration = models.TextField(blank=True, null=True)
    frequency = models.CharField(max_length=2)
    dosage_unit = models.CharField(max_length=2, default=Weight.MILLILITERS)
    dosage = models.IntegerField(blank=True, null=True)

    notes = models.CharField(max_length=2048, blank=True, null=True)

    created = models.DateTimeField(blank=True, null=True)
    modified = models.DateTimeField(blank=True, null=True)
    showRow = models.BooleanField(default=True)

    def save(self, *args, **kwargs):
        # Save time Medication object modified and created times
        self.modified = datetime.datetime.now()
        if not self.created:
            self.created = datetime.datetime.now()

        super(Medication, self).save(*args, **kwargs)



    def __str__(self):
        if self.cat:
            cat_name = self.cat.name
        else:
            cat_name = "NO CAT NAME"
        return "{cat}: {timestamp}".format(cat=self.cat.name, timestamp=self.created)

和views.py ....

class MedicationViewSet(viewsets.ModelViewSet):
    queryset = Medication.objects.all()
    serializer_class = MedicationSerializer
    filter_fields = ('cat__slug', 'cat__name')
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

尝试将 read-only = True 添加到Catserializer中

class MedicationSerializer(serializers.HyperlinkedModelSerializer):
    cat = CatSerializer(read_only=True)

    class Meta:
        model = Medication
        fields = (
            'id',
            'cat',
            'name',
            'duration',
            'frequency',
            'dosage_unit',
            'dosage',
            'notes',
            'created',
            'modified',
            'showRow',
        )

    def create(self, validated_data):
        cat_data = validated_data.pop('cat')
        cat_obj = Cat.objects.get(**cat_data)
        medication = Medication.objects.create(cat=cat_obj, **validated_data)
        return medication
相关问题