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