首页 > 解决方案 > 在 django rest 框架中创建对象时,将用户数据传递给嵌套序列化程序中的序列化程序

问题描述

当用户尝试添加公告时,我应该在表单中传递用户的所有信息吗?我正在使用令牌身份验证。因此,要添加公告,用户必须经过身份验证。

模型.py

class User(AbstractUser):
    username = None
    email = models.EmailField(max_length=100, verbose_name='email', 
              unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = UserManager()

class Announcement(models.Model):
     author = models.ForeignKey(User, on_delete=models.CASCADE)
     name = models.CharField(max_length=100)
     photo = models.ManyToManyField(Photo, blank=True)

class Photo(models.Model):
     name = models.CharField(max_length=100)
     content_type = models.CharField(max_length=100)
     path = models.CharField(max_length=100)

class Parameter(models.Model):
     name = models.CharField(max_length=100)
     value = models.FloatField(blank=True, null=True)
     announcement = models.ForeignKey(
     Announcement,related_name='parameters', on_delete=models.CASCADE)

序列化程序.py


class AnnouncementSerializer(serializers.ModelSerializer):
    author = UserSerializer(required=True)
    parameters = ParameterSerializer(many=True, 
       required=False)
    photo = PhotoSerializer(many=True, 
        required=False)
    class Meta:
        model = Announcement
        fields = ['id', 'name', 'author', 
                         'parameters', 'photo']

class UserSerializer(serializers.ModelSerializer):
    photo = PhotoSerializer()
    class Meta:
        model = User
        fields = ['id', 'email','photo', ]

class ParameterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Parameter
        fields = '__all__'
class PhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields = '__all__'

视图.py

class AnnouncementCreate(CreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = models.Announcement.objects.all()
    serializer_class = AnnouncementSerializer



尝试可浏览 API 时。要创建新公告,我必须输入用户的所有信息。但是如果用户已经通过身份验证。是否有任何解决方案可以仅为该用户创建公告并将其显示给其他用户?

标签: pythondjangodjango-modelsdjango-rest-frameworktoken

解决方案


如果您不想在创建User时创建Announcement,请省略 中的author字段AnnouncementSerializer,然后在保存序列化程序对象时传递当前用户:

序列化程序.py

class AnnouncementSerializer(serializers.ModelSerializer):
    parameters = ParameterSerializer(many=True, required=False)
    photo = PhotoSerializer(many=True, required=False)

    class Meta:
        model = Announcement
        fields = ['id', 'name', 'parameters', 'photo']

视图.py

class AnnouncementCreate(CreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = models.Announcement.objects.all()
    serializer_class = AnnouncementSerializer

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

推荐阅读