【问题标题】:Django - Limit the number of instances of a model for every userDjango - 限制每个用户的模型实例数
【发布时间】:2016-12-14 22:11:52
【问题描述】:

我想限制特定类的实例数。我已经通过使用一些 HTML 对其进行了限制,但如果有人偷偷重复使用表单的链接,则可以创建另一个实例。

所以在我的 views.py 中,我进行了查询

qry_models = Model.objects.filter(owner=request.user)

在我的 HTML 模板中,我已经进行了调整以防止出现多个实例。如果没有,则重定向到 ModelForm 以创建实例。如果查询中有模型,则显示/可用。

{% for model in qry_models %}
    {{ model }}
{% empty %}
    <a href="{% url 'app:model_new' %}">Make a new instance</a>
{% endfor %}

但是如果有人重用了一个被重定向到的链接,他可以创建另一个实例。应该防止这种情况发生。

我想为每个用户帐户创建一个实例。如果我关注Limit number of model instances to be created,我总是会收到 MultipleObjectsReturned 错误,因为它会查询来自所有帐户的所有实例,而不仅仅是来自活动/登录帐户的实例。

编辑: 如果已经有一个实例,我做了另一个总是重定向我的查询。但那是好的代码设计还是只是一个有用的逻辑圈?

def model_new(request):
    mymodel = Model.objects.filter(owner=request.user)
    counter = mymodel.count()
    if counter >0:
        return HttpResponseRedirect('somewhere')

    if request.method != 'POST':
        form = ModelForm()
    ....

【问题讨论】:

  • 我怎样才能在管理员中阻止它?
  • 你的模型是什么样的?我建议将owner 字段定义为OneToOneField 而不是ForeignKey
  • 限制是多少?一个实例,还是其他一些?
  • 每个用户只需要一个相关模型还是不同用户需要不同数量?
  • @AndreyShipilov OP 说“我希望每个用户帐户都有一个实例。”

标签: django validation django-models


【解决方案1】:

在 Django 中限制用户实例的最佳实践是将one-to-one field relationship 映射到表中的用户列。

# models.py
from django.db import models

class Student(models.Model):
    user = models.OneToOneField(User)
    course = models.CharField(max_length=100)

#Refactoring your views.py
from django.http import HttpResponse

def create_student(request):
    if not Student.objects.filter(user=request.user).exists():
        Student.objects.create(user=request.user, course='Engineering')
        return HttpResponse('Student is created')
   else:
       return HttpResponse('Student already exists')

【讨论】:

  • 如果要求只有一个实例,是的,这是正确的方法。但是标题说“限制实例数”并没有说一个
猜你喜欢
  • 2011-01-09
  • 2018-08-13
  • 2018-02-07
  • 1970-01-01
  • 2011-10-13
  • 2019-01-25
  • 2011-02-20
  • 1970-01-01
  • 2011-03-26
相关资源
最近更新 更多