我有以下模型:
class Follow(models.Model):
user = models.ForeignKey(
"User", related_name="follower", on_delete=models.CASCADE)
following_user = models.ForeignKey(
"User", related_name="following", blank=True, on_delete=models.CASCADE)
date_followed = models.DateTimeField(editable=False, default=timezone.now)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['user', 'following_user'], name="unique_followers")
]
ordering = ["-date_followed"]
def __str__(self):
return f"{self.user.username} follows {self.following_user.username}"
和串行器:
class FollowSerializer(serializers.ModelSerializer):
class Meta:
model = Follow
fields = ['user', 'following_user', 'date_followed']
然后在我的视图中,我有一个APIView创建以下内容:
class FollowingView(APIView):
permission_class = [permissions.IsAuthenticated]
queryset = Follow.objects.all()
serializer_class = FollowSerializer
def post(self, request):
user = request.data.get('user')
following_user = request.data.get('to_user')
try:
follow = Follow.objects.create(
user=user, following_user=following_user)
follow.save()
serializer = FollowSerializer(follow)
print(serializer.data)
def __str__(self):
return f"{self.request.username} follows {self.following_user_id.username}"
return Response(serializer.data, status=status.HTTP_201_CREATED)
except:
return Response(status=status.HTTP_400_BAD_REQUEST)
不知道出了什么问题。我可以打印参数,但似乎创建功能没有通过。
感谢您的帮助!
3条答案
按热度按时间7gyucuyw1#
第一个问题是在这一行:
序列化程序中没有这样的
to_user
字段,因此从请求中获取的值是None
。请相应地替换该变量。其次,我们尝试直接使用ID而不是用户示例创建
Follow
对象,在尝试创建对象之前,只需获取用户示例。编辑:有关如何正确使用序列化程序验证数据,请参阅@Ankit Tiwari的回答
ghhaqwfi2#
如果不从客户端获取数据,请首先将
read_only=True
设置为user&following_user字段。在视图中,只需验证序列化程序并将其与相关字段一起保存
ehxuflar3#
您需要删除与
object.create
一起使用的.save()
方法。object.create
用于保存表中的数据对象,因此无需.save()
您还可以保存数据并使用
APIView()
方法对其进行序列化,如下所示