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