[英]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_availability
或user
作為序列化程序字段:
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.