Django: Сериализация отношения ManyToMany со сквозным аргументом через связанную модель OneToOne

Итак, тема может быть или не быть контекстуально точной, но что я знаю, так это то, что она включает в себя все вышеперечисленное, и я упираюсь в стену... Я хочу получить URL-адрес владельца модели Workspace непосредственно на Workspace что-то вроде:

Желаемый выход

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

Модели

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="user_workspaces", 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

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

Как лучше всего сериализовать workspace.owner.workspace_user.user url для HyperlinkedModelSerializer?

Спасибо!

Я думаю, вы можете использовать serializers.SerializerMethodField для получения url.

class WorkspaceSerializer(serializers.ModelSerializer):
    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):
        return [x.url for x in obj.users]

    def get_owner(self, obj):
        return obj.owner.url
   
Вернуться на верх