2016-12-14 9 views
1

Я хочу ограничить количество экземпляров определенного класса. Я уже ограничил это, используя некоторый HTML, но если кто-то подшучивает, повторно использует ссылку на форму, можно сделать другой экземпляр.Django - Ограничить количество экземпляров модели для каждого пользователя

Так что в моем 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

Как выглядит ваша модель? Я бы предложил определить поле 'owner' как' OneToOneField' вместо 'ForeignKey'. – Selcuk

+0

Какой предел? Один экземпляр или какой-то другой номер? – Chris

ответ

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') 
+0

Если это требование только для одного экземпляра, да, это правильный путь. Но название гласит: «Ограничить количество экземпляров», не говорит – e4c5

Смежные вопросы