【问题标题】:Filter tables contain all value in another table过滤表包含另一个表中的所有值
【发布时间】:2022-02-05 00:40:56
【问题描述】:

我有 2 个表产品和用户,每个表都有权限列表,我需要向用户列出所有产品,以便用户拥有所有产品权限

检查代码表示:

产品型号:

class Product(TimeStampedModel, SoftDeletableModel):
    title = models.CharField(max_length=255, unique=True)
    permission = models.ManyToManyField(Permission, related_name="Permissions")

这是用户模型:

class User(AbstractBaseUser, SoftDeletableModel):
    display_name = models.CharField(max_length=64, blank=True)
    permission = models.ManyToManyField(Permission, related_name="Permissions")

假设我们有以下数据:

user1 权限 A1,A2,C1,C2,C3

user2 权限 A1,A2,B1,B2,C1,C2,C3

产品具有权限 A1,B1,C1

user1“没有B1权限”看不到产品

user2 可以看到产品

我尝试了以下方法:

Products.objects.filter(permission__in=user.permission.values("id"))

也试过这个 sql 查询:

Select * from products p 
Inner join productspermession pp
On p.id = pp.product_id
Inner join userpermessions up on pp.permession_id = up.permession_id
where up.user_id = 1

【问题讨论】:

    标签: sql django


    【解决方案1】:

    我通过检查用户无法访问的产品以及排除产品过滤查询中的product_ids解决了这个问题

    • 定义新模型以表示产品权限关系“我无法直接访问多对多模型”

    这是新的模型表示:

    class ProductPermission(models.Model):
    
        product = models.ForeignKey("Product", related_name="product_permission", on_delete=models.CASCADE)
        permission = models.ForeignKey(
            DisclosureCenter, related_name="product_permission", on_delete=models.CASCADE
        )
    
    
    class Product(TimeStampedModel, SoftDeletableModel):
        title = models.CharField(max_length=255, unique=True)
        permissions = models.ManyToManyField(Permission, through="ProductPermission")
    
    
    

    在过滤器部分我执行以下操作

    excluded_products = ProductPermission.objects.filter(~Q(disclosure_center__in=user.permissions.values("id"))).all()
            
    
    excluded_product_ids = [excluded_product.product_id for excluded_product in excluded_products]
    products = Product.filter(is_removed=False).exclude(id__in= excluded_product_ids)
    

    【讨论】:

    • @NixonSparrow 这是我为解决问题所做的工作
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多