You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:27:04