簡體   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