Не удается найти поле с подполем внешнего ключа в Django Rest Framework - PullRequest
0 голосов
/ 13 января 2019

Я использую инфраструктуру django для сериализации объекта django. У меня есть модель профиля, и первое поле в модели - это внешний ключ пользовательского объекта. Я хочу, чтобы можно было передать имя пользователя и URL-адреса для профиля. В Представлениях я хочу иметь возможность взять это имя пользователя, пройти через посторонний ключ пользователя и найти профиль с этим именем пользователя. Это то, что я сейчас имею в своем коде:

Views.py

class ProfileListView(ListAPIView):
    query_set = Profile.objects.all()
    serializer_class = ProfileSerializer

class ProfileDetailView(RetrieveAPIView):
    query_set = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'user__username'

urls.py

path('profile/', ProfileListView.as_view()),
path('profile/<username>', ProfileDetailView.as_view()),

serializers.py

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('user', 'gender', 'phone', 'ip_address', 'dob_month', 'dob_day',
                  'dob_year', 'address_street', 'address_city', 'address_state',
                  'address_postal', 'address_country', 'profile_pic', 'role')

models.py

class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    gender = models.CharField(max_length=12, choices=GENDER_CHOICES) # entity type
    phone = models.CharField(max_length=22)
    ip_address = models.CharField(max_length=32)
    dob_month = models.CharField(max_length=22, choices=MONTH_CHOICES)
    dob_day = models.SmallIntegerField()
    dob_year = models.SmallIntegerField()
    address_street = models.CharField(max_length=140)
    address_city = models.CharField(max_length=22)
    address_state = USStateField()
    address_postal = models.IntegerField()
    address_country = models.CharField(max_length=22)
    profile_pic = models.ImageField(upload_to='profile_pics/')
    role = models.CharField(max_length=12, choices=ROLE_CHOICES)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username + ' - ' + self.type

1 Ответ

0 голосов
/ 13 января 2019

Один из способов сделать это - переопределить метод get_object. Попробуйте вот так:

class ProfileDetailView(RetrieveAPIView):
    queryset = Profile.objects.all()  # it should be queryset not query_set
    serializer_class = ProfileSerializer

    def get_object(self):
       return self.queryset.get(user__username=self.kwargs.get('username')).first()

Есть также несколько альтернативных решений. Для этого, пожалуйста, проверьте этот ответ в SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...