具有标记为 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 的表中的匹配元素