【问题标题】:Django Rest Framework "myusers" "This field is requiredDjango Rest Framework "myusers" "此字段为必填项
【发布时间】:2020-02-03 13:20:01
【问题描述】:

我正在学习 DRF,但现在遇到了一个困扰我好几天的问题。该应用程序是一个尊巴舞类应用程序,我正在使用 DRF 在其上创建一个 API。我现在正在尝试构建的部分是用户可以将自己添加到 zumba 类中的部分(因此,他必须能够更新多对多字段)当用户注册自己时我希望 API 做什么到类(PUT 或 PATCH),就是获取他的用户名,我们从身份验证中获得,并将他添加到“myusers”字段。但由于 PUT 是空的,API 一直抱怨“myusers”是必需的。

有没有办法告诉 API 在 PUT 请求中不需要“myusers”,因为它是从身份验证令牌中提取的? (如果我在正文中手动创建带有"myusers": [{"id": 9}] 的 PUT 请求,它可以工作,但我想避免添加客户端,因为传递的数据甚至没有被使用。)

序列化器(所有只读字段是为了确保用户无法更新它们):

class UserActivityClassesSerializer(serializers.ModelSerializer):
    activitytypename = serializers.SlugRelatedField(source='activitytype', slug_field='name', read_only=True)
    activitytype = ActivityTypeSerializer(read_only=True)
    myusers = MyUsersSerializer(many=True) # serializers.HyperlinkedRelatedField(many=True, view_name='myusers-detail', read_only=True) 
    uri = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Activity
        fields = [
            'uri',
            'id',
            'name',
            'date',
            'activitytype',
            'activitytypename',
            'status',
            'myusers',
        ]
        read_only_fields = [
            'uri',
            'id',
            'name',
            'date',
            'activitytype',
            'activitytypename',
            'status',
        ]


    def get_uri(self, obj):
        request = self.context.get('request')
        return api_reverse("api-activities:classes-detail", kwargs={"id": obj.id}, request=request)

景色

class ActivityViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated]
    queryset = Activity.objects.all()
    lookup_field = 'id'

    def get_serializer_class(self):
        if self.request.user.is_staff or self.action == 'create':
            return AdminActivityClassesSerializer
        else:
            return UserActivityClassesSerializer

    def perform_update(self, serializer):
        instance = self.get_object()
        request = serializer.context['request']
        auth_user = request.user
        qs = instance.myusers.filter(id=auth_user.id)#we verify is the user is already registered, and if yes, we remove him
        if qs:
            print('delete')
            instance.myusers.remove(auth_user)
            return instance
        else:
            result = verify_valid_season_pass(auth_user, instance)
            if result == 1:
                print('add')
                instance.myusers.add(auth_user.id)
            else:
                raise serializers.ValidationError("No valid seasonpass found.")

得到更新的模型:

class Activity(models.Model):
    CLOSE = 0
    OPEN = 1
    ACTIVITY_STATUS_CHOICES = [
        (CLOSE, 'Closed'),
        (OPEN, 'Open'),
    ]
    name            = models.CharField('Activity Name', max_length=64, blank=False, null=False)
    date            = models.DateTimeField('Start Date & Time', blank=False, null=False)
    activitytype    = models.ForeignKey(ActivityType, blank=False, null=False, default=1, on_delete=models.DO_NOTHING)
    status          = models.IntegerField('Status', choices=ACTIVITY_STATUS_CHOICES, default=OPEN,)  # 1 = open, 0 = closed
    myusers         = models.ManyToManyField("users.User")

    def __str__(self):
        return self.name

有什么线索吗?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你试过了吗

    myusers = MyUsersSerializer(many=True, required=False)

    【讨论】:

    • 如此简单。我仍在学习,有时解决方案非常简单。 :-/ 谢谢!
    猜你喜欢
    • 2021-07-11
    • 2016-09-18
    • 1970-01-01
    • 2018-12-04
    • 2013-11-12
    • 2021-12-14
    • 2013-10-27
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多