Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何使用字典字段对嵌套序列化程序执行修补程序操作_Django_Python 3.x_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

Django 如何使用字典字段对嵌套序列化程序执行修补程序操作

Django 如何使用字典字段对嵌套序列化程序执行修补程序操作,django,python-3.x,django-models,django-rest-framework,django-views,Django,Python 3.x,Django Models,Django Rest Framework,Django Views,我有一个dictionary对象模型,在下面的示例中,我想设置并获取每日可用性示例 目前我能够阅读,想让它读和写,我应该为此做些什么 "teacher_date": [ { "day_available": "MON", "time_available": "Morning" }, { "day_available

我有一个dictionary对象模型,在下面的示例中,我想设置并获取每日可用性示例

目前我能够阅读,想让它读和写,我应该为此做些什么

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

这是我的模特


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文件


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

教师日期应该执行什么样的序列化才能执行写操作?

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

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

teacher\u date=可用性详细信息(many=True,read\u only=True)

参考此

您遇到了什么错误没有错误,在修补程序操作过程中没有更新教师日期,只获取工作显示更新代码,然后在主帖子上添加views.py您想做什么?我尝试删除read_only=True,然后获取以下错误`AssertionError:
.update()
方法默认情况下不支持可写嵌套字段。为序列化程序API.serializer.TeacherProfileDetails编写一个显式的
.update()
方法,或者在嵌套的序列化程序字段上设置
只读=True
`根据您的用例,下面的文章提供了两种解决方案。你可以和他们中的任何一个一起去。我的用例与您上面提到的不同,我在每个分支``“教师日期”:[{“日期可用”:“周一”,“时间可用”:“上午”},{“日期可用”:“周六”,“时间可用”:“下午”},{“day\u available”:“SUN”,“time\u available”:“night”}``在视图类的补丁中,使用与可用性相关的键获取可用性模型的DB对象,我假设该键存在于request.data中,然后在save()中传递该DB对象在补丁中,我可以得到teacher对象,还有,如何更新补丁方法中的一个字段?

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)