[英]Django: Serialize a ManyToMany relationship with a through argument via a related OneToOne model
因此,該主題可能在上下文中准確,也可能不准確,但我所知道的是它涉及以上所有內容,我正在碰壁......我希望直接在Workspace
上獲得Workspace
模型的所有者 URL,例如:
{
"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.