簡體   English   中英

如何在 Postman for API 中發布 manytomany 字段值

[英]How to post manytomany field value in Postman for API

我有一個字段是 ManyToMany。 我想在 POSTMAN 中輸入值以進行 API 后操作。 但每次它都說: “這個字段是必需的。” 即使我提供了價值。 在此處輸入圖像描述

在此處輸入圖像描述

楷模:

class Day(models.Model):
   day_name = models.CharField(
      _("Day Name"), max_length=255, null=True, blank=True)

   def __str__(self):
       return self.day_name

class TutorProfile(models.Model):

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    tutor_availablility = models.ManyToManyField(
         Day,blank=True)

序列化器:

class DaySerializer(serializers.ModelSerializer):

class Meta:
    model = Day 
    fields = '__all__'
    


class TutorProfileSerializer(serializers.ModelSerializer):

    user = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault(), source='user.username')
    image_url = serializers.SerializerMethodField('get_image_url')
    
    tutor_availablility = DaySerializer(many=True)

    class Meta:
        model = TutorProfile
        fields = '__all__'

視圖集:

@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
class TutorprofileViewSet(ModelViewSet):
    serializer_class = TutorProfileSerializer
    http_method_names = ["post", "delete", "get"]
    queryset = TutorProfile.objects.all()

使用以下models.py (請注意,如果day_name不存在,您當前的Day.__str__可能會引發異常):


class Day(models.Model):
    day_name = models.CharField(_("Day Name"), max_length=255, blank=True, null=True)

    def __str__(self):
        return self.day_name if self.day_name else "Unnamed"


class TutorProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    tutor_availability = models.ManyToManyField(Day, blank=True)

您不需要顯式添加tutor_availabilityuser作為序列化程序字段:

class DaySerializer(serializers.ModelSerializer):
    class Meta:
        model = Day
        fields = "__all__"


class TutorProfileSerializer(serializers.ModelSerializer):
    # Omitting `image_url` as not reflected in `models.py`
    # image_url = serializers.SerializerMethodField('get_image_url')
    
    class Meta:
        model = TutorProfile
        fields = "__all__"

使用此視圖集:

@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
class TutorProfileViewSet(ModelViewSet):
    serializer_class = TutorProfileSerializer
    http_method_names = ["post", "delete", "get"]
    queryset = TutorProfile.objects.all()

然后,在管理員中創建 ID 為 1 和 2 的日期后,通過發送tutor_availability字段,它應該可以工作。 要求:

{
    "user": 1,
    "tutor_availability": [1, 2]
}

回復:

{
    "id": 1,
    "user": 1,
    "tutor_availability": [
        1,
        2
    ]
}

另請注意,我已將availability availablility允許經過身份驗證的用戶在請求中傳遞user字段可能是不安全的,您可能希望從發出請求的用戶那里推斷出這一點。

在您的 TutorProfileSerializer 中,您正在為 tutor_availablility 字段使用 DaySerializer,因此當您執行發布請求時,您的發布操作將等待字典列表,您首先需要做的是刪除此行:從您的 TutorProfileSerializer 中,它將起作用.

tutor_availablility = DaySerializer(many=True)

如果問題仍然存在,則需要驗證 TutorProfileSerializer 的驗證方法。

如果它有效但你想要 GET 請求的 dict(Day 對象)列表,你需要覆蓋 ViewSet 的 get_serializer_class() 並創建兩個序列化程序,一個用於發布請求,另一個用於獲取請求:

@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
class TutorprofileViewSet(ModelViewSet):
    serializer_class = TutorProfileSerializer
    http_method_names = ["post", "delete", "get"]
    queryset = TutorProfile.objects.all()

    def get_serializer_class(self):
        if self.action.method == 'GET':
            return TutorGETProfileSerializer
        return super(TutorprofileViewSet, self).get_serializer_class()

和 2 個序列化程序:

class TutorGETProfileSerializer(serializers.ModelSerializer):

    user = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault(), source='user.username')
    image_url = serializers.SerializerMethodField('get_image_url')
    
    tutor_availablility = DaySerializer(many=True)

    class Meta:
        model = TutorProfile
        fields = '__all__'

class TutorProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = TutorProfile
        fields = '__all__'
        read_only_fields = ('user',)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM