Django REST框架获取非用户关联表主键问题求助
问题核心原因梳理及修改方案:
1. 模型层错误
- 子模型
TestDataThree中sdgdata字段的related_name与父模型TestDataTwo的user字段related_name重名,会导致反向查询冲突 sdgdata字段默认值default=-1非法,OneToOneField指向TestDataTwo表,默认值必须是关联表存在的主键值,不能直接填数值
修改后子模型代码:
class TestDataThree(models.Model): user = models.OneToOneField("auth.User", related_name="testdatathree", on_delete=models.CASCADE) # 调整related_name避免冲突,删除非法默认值,若允许空关联可加null=True sdgdata = models.OneToOneField(TestDataTwo, related_name="three_ref", on_delete=models.CASCADE, null=True) test_name_again = models.CharField(max_length=1024, null=True, default="N/A")
2. 序列化器层错误
子序列化器TestDataThreeSerializer未配置关联字段sdgdata,接口不会处理该关联关系,无法读写关联数据。
修改后子序列化器代码:
class TestDataThreeSerializer(serializers.ModelSerializer): # 只读:返回关联的TestDataTwo完整信息,不需要可删除 sdgdata = TestDataTwoSerializer(read_only=True) # 可写:接收前端传入的关联TestDataTwo主键id sdgdata_id = serializers.IntegerField(write_only=True) class Meta: model = TestDataThree fields = ( "id", "user_id", "sdgdata", "sdgdata_id", "test_name_again", )
3. 视图层调整
如果需要自动关联当前用户对应的TestDataTwo记录,不需要前端传sdgdata_id,修改TestDataThreeViewSet的perform_create方法即可:
def perform_create(self, serializer): # 先获取当前用户对应的TestDataTwo实例 test_two_obj = TestDataTwo.objects.get(user=self.request.user) serializer.save(user=self.request.user, sdgdata=test_two_obj)
注意:调用该逻辑的前提是当前用户已存在对应的TestDataTwo记录,否则会抛出查询异常,可根据业务逻辑加异常捕获即可。
内容的提问来源于stack exchange,提问作者Disc
相关产品推荐
相关产品推荐

