Как получить доступ к обратной связи с помощью Django rest framework - PullRequest
1 голос
/ 09 мая 2020

Вот мои модели:

class Profile(models.Model):
    user = models.ForeignKey(User, related_name="profile", on_delete=PROTECT)
    plan = models.ForeignKey(Plans, on_delete=PROTECT)
    full_name = models.CharField(max_length=2000)
    company_name = models.CharField(max_length=50, null=True, blank=True)
    activation_token = models.UUIDField(default=uuid.uuid4)
    activated = models.BooleanField(default=False)
    thumb = models.ImageField(upload_to='uploads/thumb/', null=True, blank=True)
    renew_data = models.DateField()
    is_paid = models.BooleanField(default=False)

И, как вы видите, у модели Profile есть поле user, которое связано с Abstract user фреймворка django. теперь вот как я вызываю их с помощью API:

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

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Profile
        fields = ['company_name']


class UserSerializer(serializers.HyperlinkedModelSerializer):
    profile_set = ProfileSerializer(
        read_only=True, many=True)  # many=True is required

    class Meta:
        model = User
        depth = 1
        fields = ['username', 'id', 'profile_set']

Но когда я вызываю API, он показывает только поля username и 'id, но не profile_set

Ответы [ 3 ]

3 голосов
/ 10 мая 2020

Ваш UserSerializer должен понравиться,

class UserSerializer(serializers.HyperlinkedModelSerializer):
    # no need to set `profile.all` as you have related name profile defined in your model
    profile_set = ProfileSerializer(source='profile', many=True)   

    class Meta:
        model = User
        depth = 1
        fields = ['username', 'id', 'profile_set']

ИЛИ,

class UserSerializer(serializers.HyperlinkedModelSerializer):

    profile = ProfileSerializer(many=True) # as you have related name `profile`  

    class Meta:
        model = User
        depth = 1
        fields = ['username', 'id', 'profile'] 
1 голос
/ 09 мая 2020

Похоже, вы установили related_name на свой внешний ключ:

user = models.ForeignKey(User, related_name="profile", on_delete=PROTECT)

Это определяет имя обратной связи, поэтому вам нужно ссылаться на него и в DRF:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    profile = ProfileSerializer(read_only=True, many=True)

class Meta:
    model = User
    depth = 1
    fields = ['username', 'id', 'profile']

Поскольку это явно множественное число, я также предлагаю вам переименовать profile в profiles.

1 голос
/ 09 мая 2020

Попробуйте установить источник вашего сериализатора:

profile_set = ProfileSerializer(
    source='profile.all',
    read_only=True, many=True
)
...