Django - 限制每个用户的模型实例数

时间:2016-12-14 22:11:52

标签: django validation django-models

我想限制特定类的实例数。我已经通过使用一些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()
    ....

1 个答案:

答案 0 :(得分: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')