首页 > 解决方案 > 允许将 django 模型字段修改为某些用户

问题描述

我正在 DRF 上构建一个市场 REST Api,其中有创作者和品牌。创作者可以发布他们的项目,品牌可以提供报价。我有一个 AbstractUser 类和

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=32, unique=True)
    first_name = models.CharField(max_length=32, blank=True)
    last_name = models.CharField(max_length=64, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    location = models.CharField(max_length=120, blank=True)
    bio = models.TextField(blank=True)
    is_creator = models.BooleanField(default=False)
    is_brand = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

class Creator(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

class Brand(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=64)

与项目相关的模型如下所示:

class Project(models.Model):
    title = models.CharField(max_length=128, )
    description = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    category = models.CharField(max_length=2, choices=CATEGORY_CHOICES)
    author = models.ForeignKey(Creator, on_delete=models.CASCADE)
    
class ProjectOffer(models.Model):
    PENDING, NEGOTIATIONS, APPROVED, DECLINED = range(4)
    STATUS = (
        (PENDING, 'Pending'),
        (NEGOTIATIONS, 'Negotiations'),
        (APPROVED, 'Approved'),
        (DECLINED, 'Declined'),
    )
    title = models.CharField(max_length=128)
    description = models.TextField()
    author = models.ForeignKey(Brand, related_name='project_offers',
                               on_delete=models.CASCADE)
    project = models.ForeignKey(Project, related_name='project_offers',
                                on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    status = models.PositiveSmallIntegerField(choices=STATUS,
                                              default=PENDING)

问题如下。项目报价由品牌方提供。它链接到一个项目。品牌应该有机会更新它的报价,比如标题或描述。但他们无法更新状态,因为它是由创建者更新的。反之亦然,创建者无法更新标题和描述字段。

我怎样才能实现这个逻辑?对于我的 ProjectOffer 视图,我使用 DRF 中的 ModelViewSet

我知道可能有两种方法:

  1. 通过权限(但真的不知道如何实现)
  2. 通过序列化程序。

有什么建议么?

标签: djangodjango-rest-framework

解决方案


推荐阅读