【问题标题】:view permission if request data not in queryset如果请求数据不在查询集中,则查看权限
【发布时间】:2014-08-05 02:10:54
【问题描述】:

我有以下看法——

class File_List(generics.ListAPIView):
    model = cdx_composites_csv
    serializer_class = cdx_compositesSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        filename = self.request.GET.get('filename')
        model = get_model('markit', filename)
        filedate = self.request.GET.get('filedate')
        queryset = model.objects.using('markitdb').filter(Date__contains=filedate)
        return queryset

现在忽略该模型被列出了两次,这是我稍后需要弄清楚的同一模型。

对于权限,如果发生以下情况,我希望它拒绝访问。

我的 models.py 中有一个扩展的 Auth

class FileIndex(models.Model):
    filename = models.CharField(max_length=256)
    filetype = models.CharField(max_length=16)
    vendorid = models.IntegerField()
    vendorname = models.CharField(max_length=256)
    tablename = models.CharField(max_length=256)
    class Meta:
        db_table = 'file_index'
        verbose_name = 'File/Vendor Index'
        verbose_name_plural = 'File/Vendor Indicies'
    def __str__(self):
        return self.filename

class UserFile(models.Model):
    userid = models.ForeignKey(User)
    fileid = models.ForeignKey(FileIndex)
    grant_date = models.DateTimeField()
    revoke_date = models.DateTimeField(blank=True)
    class Meta:
        db_table = 'auth_files'
        verbose_name = 'User File Matrix'
        verbose_name_plural = 'User File Matricies'

我想说的是,如果文件名没有显示,用户访问将被拒绝。

在 SQL 中,只需返回用户有权访问的文件名列表 -

select * from auth_files af
inner join auth_user au on au.id = af.userid
inner join file_index fi on fi.id = af.fileid
where au.user = 'user logged in'

然后我想告诉它,如果请求中的文件名在上述查询返回的文件名列表中,那么是的,用户可以做他们想做的事。

更新 - 像这样调整 -

class File_List(generics.ListAPIView):
    model = cdx_composites_csv
    serializer_class = cdx_compositesSerializer

    def get_queryset(self):
#        authorized_files = UserFile.objects.filter(userid=self.request.user).values_list('fileid')
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        filename = self.request.GET.get('filename')
        model = get_model('markit', filename)
        filedate = self.request.GET.get('filedate')

        if FileIndex.objects.filter(filename=filename).exists():
            queryset = model.objects.using('markitdb').filter(Date__contains=filedate)
            return queryset

我现在收到以下错误 -

'NoneType' object is not iterable

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在您看来,您可以像这样检查:

    filename = self.request.GET.get('filename')
    if FileIndex.objects.filter(filename=filename).exists():
        #do something
    

    【讨论】:

    • 更新我的问题我得到 'NoneType' 对象现在不可迭代。
    • 我一发布我就剥离了我的例子,我现在明白了逻辑,所以谢谢你!这不是我要做的,但它为我指明了正确的方向!
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2017-09-26
    • 2017-08-07
    • 2018-10-29
    • 2023-04-01
    • 2018-05-02
    • 2021-02-15
    • 2021-04-24
    相关资源
    最近更新 更多