Как выполнить операцию исправления на вложенном сериализаторе с полем словаря - PullRequest
2 голосов
/ 20 января 2020

У меня есть Модель с объектом словаря, в следующем примере я хочу установить и получить пример ежедневной доступности

В настоящее время я могу читать, хочу сделать это, чтобы читать и писать, что мне делать для этого

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

Вот мой model.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


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 также выполнить операцию записи?

1 Ответ

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

Проблема заключается в том, как вы определили свой сериализатор.

Вы определили teacher_date как поле read_only. Следовательно, это поле будет игнорироваться при вызове PUT / POST.

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

См. Это https://www.django-rest-framework.org/api-guide/fields/#read_only

...