繁体   English   中英

Django:通过相关的 OneToOne model 使用 through 参数序列化 ManyToMany 关系

[英]Django: Serialize a ManyToMany relationship with a through argument via a related OneToOne model

因此,该主题可能在上下文中准确,也可能不准确,但我所知道的是它涉及以上所有内容,我正在碰壁......我希望直接在Workspace上获得Workspace模型的所有者 URL,例如:

所需 Output

{
    "url": "http://127.0.0.1:8000/api/workspaces/1/",
    "id": 1,
    "name": "Ws 1",
    "slug": "ws-1",
    "users": [
        "http://127.0.0.1:8000/api/users/2/",
        "http://127.0.0.1:8000/api/users/4/"
    ],
    "owner": "http://127.0.0.1:8000/api/users/2/"
}

模型.py

class Workspace(models.Model):
    name = models.CharField(max_length=80)
    users = models.ManyToManyField(UserModel, through="workspaces.WorkspaceUser", related_name="workspaces")

class WorkspaceUser(models.Mode):
    user = models.ForeignKey(User, related_name="workspace_users", on_delete=models.CASCADE)
    workspace = models.ForeignKey( Workspace, related_name="workspace_users",on_delete=models.CASCADE)

class WorkspaceOwner(BaseTimeStampedModel):
    workspace_user = models.OneToOneField(WorkspaceUser, on_delete=models.CASCADE)
    workspace = models.OneToOneField(Workspace, related_name="owner", on_delete=models.CASCADE)

序列化器.py

class WorkspaceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Workspace
        fields = ["url", "id", "name", "slug", "users", "owner"]

class WorkspaceUserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = WorkspaceUser
        fields = ["url", "id", "user"]

class WorkspaceOwnerSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = WorkspaceOwner
        fields = ["url", "id", "user"]

我怎样才能最好地为HyperlinkedModelSerializer序列化workspace.owner.workspace_user.user url

我认为您可以使用serializers.SerializerMethodField来获取 url。

class WorkspaceSerializer(serializers.HyperlinkedModelSerializer):
    users = serializers.SerializerMethodField(read_only = True)
    owner = serializers.SerializerMethodField(read_only = True)

    class Meta:
        model = Workspace
        fields = ["url", "id", "name", "slug", "users", "owner"]

    def get_users(self, obj):
        cur_request = self.context['request']
        return [UserSerializer(x, context={'request': cur_request}).data['url'] for x in obj.users]

    def get_owner(self, obj):
        cur_request = self.context['request']
        return WorkspaceOwnerSerializer(obj.owner, context={'request': cur_request}).data['url']
   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM