Сделайте Django Rest Api специфичным для пользователя (get_queryset) - PullRequest
2 голосов
/ 02 июня 2019

Я хочу создать API-интерфейс rest из Django, который будет специфичным для пользователя, чтобы я указывал / username в конце URL.

Модели:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
age = models.IntegerField()
description = models.CharField(max_length=300)

class Meta:
    verbose_name_plural = 'User Profiles'

def __str__(self):
    return self.user.username

@receiver(post_save, sender=User)
def create_user_data(sender, update_fields, created, instance, **kwargs):
if created:
    user  = instance
    profile = UserProfile.objects.create(user=user, age=18, description='No Description')

class Notes(models.Model):
note = models.CharField(max_length=1000)
parent_user = models.OneToOneField(UserProfile, blank=True, on_delete=models.CASCADE)

class Meta:
    verbose_name_plural = 'Notes'

def __str__(self):
    return self.note

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

class NoteSerializer(serializers.ModelSerializer):
class Meta:
    model = Notes
    fields = ('id', 'note', 'parent_user')

urls:

router = routers.DefaultRouter()
router.register('notes', views.UserNoteView)

urlpatterns = [
    path('', include(router.urls)),
]

просмотров:

class NoteView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = Notes.objects.all()
serializer_class = NoteSerializer

class UserNoteView(NoteView):
def get_queryset(self):
    return self.request.parent_user.Notes.all()

Моя проблема в том, что я не могу сделать, например / Уильям, который является именем моего пользователя, иПрофиль пользователя.Кто-то, кто знает это, должен быть в состоянии помочь!

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Вы фильтруете QuerySet неправильно. Попробуйте следующий фрагмент,

class UserNoteView(NoteView):
    def get_queryset(self):
        <b>return Notes.objects.filter(parent_user__user=self.request.user)</b>

Таким образом, вам не нужно добавлять имя пользователя в конечную точку API. DRF получит информацию о зарегистрированном пользователе (если вы указали классы аутентификации), а затем отфильтруйте Notes, соответствующий этому пользователю.

0 голосов
/ 03 июня 2019

Ваши заметки model неверны.Измените OneToOneField на ForeignKey.Вы можете изменить его, как показано ниже

class Notes(models.Model):
    note = models.CharField(max_length=1000)
    parent_user = models.ForeignKey(
        UserProfile, blank=True, on_delete=models.CASCADE, related_name="notes")

    def __str__(self):
        return "{note}".format(note=self.note)

Теперь измените свой viewset, как показано ниже

class UserNoteView(NoteView):

    def get_queryset(self):
        return self.request.user.userprofile.notes.all()
        # or
        return Notes.objects.filter(parent_user__user=self.request.user)
...