在DRF中进行序列化程序验证期间获取实例

时间:2016-10-11 15:14:19

标签: django-rest-framework

我开始使用Django REST framework处理我已经开发的mini-reddit项目。

问题是我遇到了这种情况:

Minisub就像一个subreddit。除其他外,它还有一个名为managers的字段ManyToMany User

Ad是一个广告,将显示在minisub上,它有一个名为minisubs的字段ManyToMany Minisub。它还有一个author字段,带有User的外键。

我想允许这些管理员通过DRF API在其minisub上添加一些广告。它实际上是有效的。但是我想检查一下,他们只将minisubs放在他们是经理的小管中。

我找到了这样的方式:

class AdSerializer(serializers.HyperlinkedModelSerializer):
    # ...

    def validate_minisubs(self, value):
        for m in value:
            if user not in m.managers.all():
                raise serializers.ValidationError("...")
        return value

我的问题是:如何获得user?我找不到获取值Ad.author的方法(根据用户身份验证,此字段在串行数据中自动设置)。也许我找不到办法因为没办法?这样做的地方是在其他地方吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为这是permissions的工作,如果您正在执行CRUD操作以将其插入数据库,那么如果用户是经理,则可以让权限类返回True

权限实例可以访问您可以用来获取用户并检查他是否是经理的请求: http://www.django-rest-framework.org/api-guide/permissions/#custom-permissions

答案 1 :(得分:0)

您可以通过以下方式将其从序列化器中删除:

class YourModelSeializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=YourModel
    
    def validate_myfield(self):
        instance = getattr(self, 'instance', None)
        ...