如何在具有字典字段的嵌套序列化程序上执行补丁操作 [英] How perform patch operation on nested serializer with dictionary field

查看:56
本文介绍了如何在具有字典字段的嵌套序列化程序上执行补丁操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带字典对象的模型,在下面的示例中要设置并获取每日可用性示例

I have Model with dictionary object, in below example want to set and get daily availability example

当前我能够阅读,希望使其阅读并写,我应该为此做什么

Currently I am able to read, want to make this to read and write, what should I do for this

        "teacher_date": [
            {
                "day_available": "MON",
                "time_available": "Morning"
            },
            {
                "day_available": "SAT",
                "time_available": "Afternoon"
            },
            {
                "day_available": "SUN",
                "time_available": "Evening"
            }

这是我的模型。py


class Availability(models.Model):
    uid = models.AutoField(verbose_name='ID', 
                                  serialize=False, 
                                  auto_created=True, 
                                  primary_key=True)
    MONDAY = 'MON'
    TUESDAY = 'TUE'
    WEDNESDAY = "WED"
    THURSDAY = "THU"
    FRIDAY = 'FRI'
    SATURDAY = "SAT"
    SUNDAY = "SUN"
    DAY = (
        (MONDAY, 'Monday'),
        (TUESDAY, 'Tuesday'),
        (WEDNESDAY, 'Wednesday'),
        (THURSDAY, 'Thursday'),
        (FRIDAY, 'Friday'),
        (SATURDAY, 'Saturday'),
        (SUNDAY, 'Sunday'),
    )
    day_available = models.CharField(
        max_length=3, choices=DAY, default=MONDAY)

    MORNING = 'Morning'
    NOON = 'AfterNoon'
    EVENING = 'Evening'
    TIME = (
        (MORNING, 'Morning'),
        (NOON, 'Afternoon'),
        (EVENING, 'Evening'),
    )

    time_available = models.CharField(
        max_length=30, choices=TIME, default=MORNING)

    def __str__(self):
        return f"{self.day_available} {self.time_available}"


这是我的serializer.py文件

Here is my serializer.py file


class AvailabilityDetails(serializers.ModelSerializer):
    class Meta:
        model = Availability
        fields = ('day_available', 'time_available',)


class TeacherProfileDetails(serializers.ModelSerializer):
    logger = logging.getLogger(__name__)
    teacher_date = AvailabilityDetails(many=True, read_only=True)
    first_name = serializers.CharField(source='user.first_name', read_only=True)
    last_name = serializers.CharField(source='user.last_name', read_only=True)
    cities = serializers.SlugRelatedField(many=True, slug_field='city', queryset=City.objects.all(),)
    subject = serializers.SlugRelatedField(many=True, slug_field='subject', queryset=Subject.objects.all(),)
    teacher_date = AvailabilityDetails(many=True, read_only=True)
    user = UserDetailsSerializer(read_only=True)

    class Meta:
        model = Teacher
        fields = ('user', 'first_name', 'last_name', 
                  'bio', 'teacher_cost', 'subject', 'teacher_date', 'cities')

    def get_subject(self, obj):
        subject_list = []
        for i in obj.subject.all():
            subject_list.append(i.subject)
        return subject_list




Here is my **views.py**

class TeacherListCreateAPIView(APIView):
        logger = logging.getLogger(__name__)

        #def create(self, request, *args, **kwargs):
        def get(self, request, *args, **kwargs):
            self.logger.info("Geeting TeacherListCreateAPIView information")
            teacherList = Teacher.objects.filter(user__username=kwargs["username"])
            self.logger.info(teacherList)
            serializers = TeacherProfileDetails(teacherList, many=True)
            self.logger.info(serializers.data)
            return Response(serializers.data)
        def patch(self, request, *args, **kwargs):
            teacher = Teacher.objects.get(user__username=kwargs['username'])
            serializers = TeacherProfileDetails(data=request.data, instance=teacher)
            self.logger.info(serializers)
            if serializers.is_valid():
                serializers.save()
                return Response(serializers.data, status=status.HTTP_201_CREATED)
            return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

应该在 teacher_date 上执行哪种序列化以执行写操作?

What kind of serialization should be done on teacher_date to perform write operation also ?

推荐答案

问题在于定义序列化程序的方式。

Problem lies in the way you have defined your serializer.

您已将 teacher_date 定义为只读字段。因此,在PUT / POST调用中将忽略此字段。

You have defined teacher_date as read_only field. Hence, this field will be ignored in PUT/POST call.

teacher_date = AvailabilityDetails(many = True,read_only = True)

请参考此
https://www.django-rest-framework.org/api-guide/fields/#read_only

这篇关于如何在具有字典字段的嵌套序列化程序上执行补丁操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆