Я с нетерпением жду создания API отдыха "Mother of REST" с каркасом REST django. Поэтому мне нравится, когда все отношения представлены в виде URL. С помощью Spring Boot это довольно просто, но я не думаю, что для django REST. Пожалуйста, поправьте меня, если я ошибаюсь.
У меня есть модели:
class User(AbstractBaseUser):
username = models.CharField(max_length=25, unique=True)
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True)
class Group(models.Model):
admin = models.ForeignKey(User, related_name='groups', on_delete=models.PROTECT)
shared_user = models.ManyToManyField(User, related_name='shared_groups')
name = models.CharField(max_length=25)
description = models.TextField()
created_at = models.DateField(auto_now=True)
Теперь мне нравятся корабли отношений модели, которые можно сериализовать, как в следующей схеме (для краткости я показываю только модель User как json):
{
"id":1,
"username":"user_1",
"email":"user_1@test.de",
"created_at":"2019-03-08T08:42:34.766951Z",
"_links":{
"self":"http://127.0.0.1:8000/users/1/",
"groups":"http://127.0.0.1:8000/users/1/groups"
}
}
Я знаю, что могу получить URL self
, передав его в fields
, но мне нравится иметь его в разделе _links
. Я попытался использовать serializers.SerializerMethodField
, чтобы добавить дополнительную информацию. Но я понятия не имею, генерировать URL для представления объектов.
Может кто-нибудь помочь?
Кстати сериализатор:
class UserSerializer(serializers.HyperlinkedModelSerializer):
_links = serializers.SerializerMethodField('representations')
class Meta:
model = User
fields = ('id', 'username', 'email', 'created_at', 'password', '_links')
extra_kwargs = {
'password': {'write_only': True},
'groups': {'read_only': True}
}
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
def representations(self, obj):
_links = dict()
_links['self'] = 'link to user'
_links['groups'] = 'hers should be the link to the groups'
return _links