【问题标题】:How limit a user to save database in django?如何限制用户在 django 中保存数据库?
【发布时间】:2017-09-26 03:51:51
【问题描述】:

如何限制用户在数据库中保存对象

class model_name(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
   user = models.ForeignKey(User)
   foo = models.CharField(max_length=51)

我想将 foo 限制为每个用户仅 10 个条目

我使用 mysql 作为后端

【问题讨论】:

  • 如果你使用 postgre 作为后端数据库,你可以使用像 ArrayFields 这样的东西。而对于这些数组,cou可以控制长度、内容等。
  • 我使用 mysql 作为后端
  • 是的,已经注意到了,我的错。也许您可以根据您的要求等切换底层数据库。您始终可以选择执行代码before a model field becomes saved,所以这对您来说也可能是一个有用的技巧。
  • 有什么办法可以在forms.py中验证
  • 如果你想在form.py中实现,我想最直观的方法是在用户插入/更新foo之前检查数据库中的foo数量。如果记录数>10,则向用户响应错误消息。

标签: python mysql django django-models django-mysql


【解决方案1】:

你可以的

class model_name(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
   user = models.ForeignKey(User)
   foo = models.CharField(max_length=51)

   def save(self, *args, **kwargs):
       if self.__class__.objects.filter(user=self.user).count()>=10:
           return None
       return super(model_name, self).save(*args, **kwargs)
       #return super().save(*args, **kwargs) python3.x

如果你使用forms,你可以通过更新Form.clean方法来做同样的事情

def clean(self):
    super(MyForm, self).clean()
    if model_name.objects.filter(user=self.cleaned_data['user']).count()>=10:
           raise forms.ValidationError("You have exceeded limit.")

【讨论】:

  • 我已经尝试过表单,但它不会显示验证错误
  • @brunodesthuilliers 是的,我的意思是 :)。
  • 你正在渲染表单吗?是管理员吗?
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2020-02-03
  • 2021-02-22
  • 2018-09-05
  • 2015-06-21
相关资源
最近更新 更多