【问题标题】:Make Django Rest Api User Specific (get_queryset)使 Django Rest Api 用户特定(get_queryset)
【发布时间】:2019-10-18 11:21:06
【问题描述】:

我想制作一个特定于用户的 Django rest api,以便我在 url 末尾执行 /username。

型号:

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')

网址:

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()

我的问题是我不能做例如 /William 这是我的用户名和用户个人资料。知道这一点的人一定能够提供帮助!

【问题讨论】:

  • 你用什么做前端?你应该在那里做这个
  • 颤振+反应

标签: django django-models django-rest-framework django-views django-urls


【解决方案1】:

您以错误的方式过滤 QuerySet。试试下面的sn-p,

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

因此,您无需向 API 端点添加任何用户名。 DRF 将获取登录的用户信息(如果您指定了身份验证类),然后过滤掉与该用户对应的 Notes

【讨论】:

    【解决方案2】:

    您的笔记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)
    

    【讨论】:

    • 谢谢,但是如何将多个用户分配给一个笔记?如何为多个用户创建外键*?
    • @WilliamAbrahamsson 在这种情况下你必须使用ManyToManyField 而不是ForeignKey
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 2016-12-27
    • 2017-11-29
    • 2017-06-11
    • 2022-12-23
    • 1970-01-01
    相关资源
    最近更新 更多