Django REST Framework中ModelSerializer的read_only_fields不生效问题
解决POST创建Todo时的关联用户问题
嘿,我来帮你排查这个POST请求的问题!从你贴的代码来看,最可能的情况是:当你提交POST请求创建新Todo时,新创建的条目没有关联到当前登录的用户,甚至可能直接抛出数据库错误(毕竟你的Todo模型肯定有user外键字段,而这个字段是必填的对吧?)
原因很简单:你的ListCreateAPIView默认的创建逻辑不会自动把当前登录用户绑定到新的Todo实例上,你的序列化器里也没有处理user字段的填充。
这里有两种简单的解决办法,选一种就行:
方法一:重写视图的perform_create钩子(推荐)
遵循DRY原则,直接在视图里添加这个钩子方法,把当前用户传给序列化器的保存逻辑:
class TodoAPI(generics.ListCreateAPIView): permission_classes = (IsAuthenticated, ) serializer_class = TodoSerializer def get_queryset(self): user = self.request.user return Todo.objects.filter(user=user) # 添加这个方法,关联当前用户到新Todo def perform_create(self, serializer): serializer.save(user=self.request.user)
方法二:在序列化器中自动填充用户字段
如果想把用户关联的逻辑放在序列化器层面,可以用HiddenField和CurrentUserDefault来自动获取当前登录用户:
class TodoSerializer(serializers.ModelSerializer): # 隐藏字段,自动填充当前登录用户 user = serializers.HiddenField(default=serializers.CurrentUserDefault()) class Meta: model = Todo # 记得把user加入fields列表 fields = ('id', 'title', 'description', 'completed', 'created_at', 'user') read_only_fields = ('id', )
额外验证
别忘了确认你的Todo模型确实有正确的user外键字段,比如:
from django.contrib.auth.models import User from django.db import models class Todo(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=100) description = models.TextField(blank=True) completed = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True)
这样处理后,你再提交POST请求,新的Todo就会自动关联到当前登录的用户,也能正常通过你的get_queryset过滤出来啦!
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

