具有标记为 pk + fk 的字段的表上的 Django HyperlinkedModelSerializer

Posted

技术标签:

【中文标题】具有标记为 pk + fk 的字段的表上的 Django HyperlinkedModelSerializer【英文标题】:Django HyperlinkedModelSerializer on a table that has a field marked as pk + fk 【发布时间】:2021-12-20 05:05:49 【问题描述】:

我有这个表,它有一个标记为主键的字段,当它也是一个外键时。不理想,但目前需要处理。

class Profile(models.Model):

    class Meta:
        verbose_name_plural = "Profiles"
        
    member = models.OneToOneField(
        Member,
        on_delete=models.CASCADE,
        primary_key=True,
    )

    ...

现在我有一个用于 Member 和 Profile 模型的 django-rest-framework 序列化程序,看起来像这样,

class MemberSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
       model = Member
       fields = ('id', 'role_id', 'user_id')
       
class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
       model = Profile
       fields = ['member_id','bio','address','mobile'] 

我的问题是,当我从 MemberProfileSerializer 中提取“member_id”时,它会正确列出 id(这是 Profile 的 pk 的 id,也是 Member 表的 fk)

但如果我需要从 Member 模型中提取更多信息,并且为此,如果我添加对 MemberSerializer 的引用,我会在结果中返回一个空对象!

class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):

    member_id = MemberSerializer()
    class Meta:
       model = Profile
       fields = ['member_id','bio','address','mobile']

此外,如果我为 member_id 添加一个 HyperlinkedRelatedField 条目,

class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):

        member_id = serializers.HyperlinkedRelatedField(
            view_name = 'member-detail',
            lookup_field='id',
            read_only=True)
            
        class Meta:
           model = Profile
           fields = ['member_id','bio','address','mobile']

我收到以下错误。

"'int' 对象没有属性 'id'"

基本上,不知何故,序列化程序根本没有将此字段视为外键。有什么方法可以强制这种行为?

【问题讨论】:

为什么不使用Profile继承自Member的模型继承:docs.djangoproject.com/en/3.2/topics/db/models 我已经定义了一个继承,@WillemVanOnsem。我的个人资料模型定义了一个“member = models.OneToOneField(...”。 是的,但这正是 Django 为模型继承所做的。然而,优点是您可以使用这样的模型,它将包括“父”字段。换句话说,通过使用模型继承,可以简化很多任务。例如,查询将通过配置文件表上的 JOIN 自动完成。 这很有趣!将进一步探索这个.. 但是我仍然无法映射继承将如何帮助我.. 我的序列化程序被“锁定”到 Profile 模型。如果我只是尝试在个人资料中查找成员字段,则会收到“个人资料中不存在 user_id”错误。 【参考方案1】:

其实。愚弄我。 必须在配置文件中引用成员对象,作为“成员”而不是“成员 ID”。

class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):

        member = MemberSerializer()
            
        class Meta:
           model = Profile
           fields = ['member','bio','address','mobile']

威廉,感谢您的建议!

【讨论】:

以上是关于具有标记为 pk + fk 的字段的表上的 Django HyperlinkedModelSerializer的主要内容,如果未能解决你的问题,请参考以下文章

如何查询具有基数的表以显示所有 Pk,同时还显示具有 FK 的表中的匹配元素

数据库表上的 1 对 1 关系有味道吗?

如何在 EF Code First 中声明具有 Medium Blob 数据类型的表上的字段

违反 PRIMARY KEY 约束。无法插入重复键

查询联结表中FK引用的表中的其他字段

SQL 在 Where 子句中处理可为空的外键