简体   繁体   中英

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

So the subject may or may not be contextually accurate but what I do know is it involves all of the above and I'm hitting a wall... I'm looking to get a Workspace model's owner URL directly on the Workspace something like:

Desired 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/"
}

Models.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)

Serializers.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"]

How can I best serialize the workspace.owner.workspace_user.user url for the HyperlinkedModelSerializer ?

I think you can use serializers.SerializerMethodField to get the 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']
   

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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