我的问题是一个视图为用户提供了创建广告的功能,但我的序列化程序不允许选择作者。(如果创建广告的用户不能选择自己,而是选择管理员,那将是愚蠢的)
但这分别是问题所在,我无法从 request.user 序列化程序中填写排除字段。
我的代码:
模型
class Ad(models.Model):
author = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
null=True
)
category = models.ForeignKey(
Category,
null=True,
on_delete=models.SET_NULL
)
name = models.CharField(
max_length=80,
)
text = models.TextField(
max_length=256,
)
cost = models.PositiveIntegerField(
)
currency = models.ForeignKey(
Currency,
null=True,
on_delete=models.SET_NULL
)
city = models.ForeignKey(
City,
null=True,
on_delete=models.SET_NULL
)
pub_date = models.DateTimeField(
auto_now_add=True
)
class Meta:
ordering = ['-pub_date']
def __str__(self):
return self.name
串行器
class AdSerializer(serializers.ModelSerializer):
class Meta:
model = models.Ad
exclude = ['author']
表现
class CreateMixin(views.APIView):
"""Allows heirs to use the same method of creating objects."""
serializer_class = permission_classes = None
def post(self, request):
"""Creates an object and, if everything is successful,
returns its serialized form to the user."""
serializer = self.serializer_class(data=request.data)
if serializer.is_valid() and serializer.save():
return Response(serializer.data, status=status.HTTP_201_CREATED)
class CreateAd(CreateMixin):
"""Provides functionality for creating an ad."""
serializer_class = serializers.AdSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
我和其他人一起从我的 mixin 继承了创建广告的视图。很明显,当可以分配作者对象字段时,我将停止继承,因为mixin提供了抽象框架限制的功能,因此,不要关注它)
我认为你已经把自己逼到了一个角落。将作者返回给序列化程序,并按照尝试和真实的方式进行操作。
我在一个额外的序列化程序中找到了解决方案,该序列化程序负责创建和修改广告。
一个序列化器用于显示包含视图集中所有字段的广告列表,另一个用于创建绕过作者字段的广告以避免不必要的点击。