Джанго ДРФ следит за отношениями - PullRequest
0 голосов
/ 30 октября 2018

Ну, я пытаюсь следить за отношениями с Django Rest Framework.

Вот упрощенная модель:

class Model1(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Model2(models.Model):
    title = models.CharField(max_length=12, null=True, blank=True)
    model1 = models.ForeignKey(Model1, on_delete=models.CASCADE)

И Сериализаторы:

class Model1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model2
        fields = '__all__'

Из Model2 я хотел бы получить доступ к свойствам владельца, например к электронной почте ...

Без DRF и в стандартном шаблоне я бы сделал это:

{{ instanceOfModel2.model1.owner.email }}

Это будет следовать за отношениями.

Есть ли у вас какие-либо идеи, как мне добиться этого с помощью Django DRF?

Я посмотрел на https://www.django -rest-framework.org / api-гид / отношения / Но то, что я хочу, - это обратный путь ... И я бы не хотел показывать модель Django User через REST API ....

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы должны создать пользовательский сериализатор и связать сериализаторы друг с другом.

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class Model1Serializer(serializers.ModelSerializer):
    owner = UserSerializer()
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.ModelSerializer):
    model1 = Model1Serializer()
    class Meta:
        model = Model2
        fields = '__all__'
0 голосов
/ 30 октября 2018

Если вы хотите, чтобы поле было read only:

class Model2Serializer(serializers.ModelSerializer): email = serializers.SerializerMethodField() class Meta: model = Model2 fields = ('email', ...) def get_email(self, obj): return obj.model1.owner.email

0 голосов
/ 30 октября 2018

Вы можете определить новые поля вместе с атрибутом source, используя пунктирную запись:

class Model2Serializer(serializers.ModelSerializer):
    email = serializers.EmailField(source='model1.owner.email', read_only=True)

    class Meta:
        model = Model2
        fields = '__all__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...