Django rest-framework: Spring Boot как сериализация модели - PullRequest
0 голосов
/ 08 марта 2019

Я с нетерпением жду создания 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...