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:
{
"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.