2016-11-17 2 views
0

Я использую эти модели:MultipleObjectsReturned в ... получить() возвращала более одного человека - он вернулся 2

class Person(models.Model):  
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=100) 
    name_in_bangla = models.CharField(max_length=100) 
    nick_name = models.CharField(max_length=30) 
    birth_date = models.DateField() 
    user = models.OneToOneField(
     settings.AUTH_USER_MODEL, 
     related_name='member_persons') 

    class Meta: 
     ordering = ['name'] 
     unique_together = ['name', 'birth_date'] 

мои просмотры:

class PersonCreate(SuccessMessageMixin,CreateView): 
    model = Person 
    form_class = MemberForm 
    success_message = "%(name)s was added as %(category)s successfully." 

    def get_form(self, form_class=None): 
     form = super().get_form(form_class) 
     form.request = self.request 
     return form 

мои просмотров:

class MemberForm(ModelForm): 

    class Meta: 
     model = Person 
     exclude =('user',) 

    def clean(self): 
     user = get_user(self.request) 
     name = self.cleaned_data.get('name') 
     birth_date = self.cleaned_data.get('birth_date') 
     if self.instance.id: 
      if Person.objects.filter(user=user).exclude(id=self.instance.id).exists(): 
       self.add_error('name', "You already submitted data") 
      elif Person.objects.filter(name=name, birth_date=birth_date).exclude(id=self.instance.id).exists(): 
       self.add_error('name', "Person with this Name and Birth date already exists.") 
     else: 
      if Person.objects.filter(user=user).exists(): 
       self.add_error('name', "You already submitted data") 
      elif Person.objects.filter(name=name, birth_date=birth_date).exists(): 
       self.add_error('name', "Person with this Name and Birth date already exists.") 
     return self.cleaned_data 

    def save(self, commit=True): 
     person = super().save(commit=False) 
     if not person.pk: 
      person.user = get_user(self.request) 
     if commit: 
      person.save() 
      self.save_m2m() 
     return person 

Он отлично работает для разных лиц. Но когда я пытаюсь использовать одно и то же имя для человека, но с другой датой рождения, он дает MultipleObjectReturn с 'get(), возвращенным более чем одним Person - он возвратил 2!

Но я использовал unique_together = ['name', 'birth_date'] ограничения, а также использую чистый метод, чтобы поймать ошибки ограничений в формах. Но мои формы не ловят ошибки MultipleObjectReturned.

Как я мог поймать эти ошибки в своих формах? Что мои коды делают неправильно. Любые предложения по телу будут оценены.

других МОИХ просмотры:

class PersonDetailView(generic.DetailView): 

    queryset = (
     Person.objects.all() 
     .prefetch_related('child_set') 
     # below omitted because of with tag 
     # and conditional display based on time 
     # .prefetch_related('blog_posts') 
    ) 
class PersonUpdate(SuccessMessageMixin,UpdateView): 

    model = Person 
    form_class = MemberForm 
    success_message = "%(category)s: %(name)s was updated successfully." 

    def get_form(self, form_class=None): 
     form = super().get_form(form_class) 
     form.request = self.request 
     return form 


@require_authenticated_permission(
'member.delete_person') 
class PersonDelete(DeleteView): 
    model = Person 
    success_url = '/allmember/' 

    success_message = "%(category)s: %(name)s was deleted successfully." 


    def delete(self, request, *args, **kwargs): 
     messages.success(self.request, self.success_message) 
     return super(PersonDelete, self).delete(request, *args, **kwargs) 
+0

Где вы можете получить эту ошибку? – Rohan

+0

Я получаю эту ошибку, когда я отправил форму, и ошибка отображается на локальном хосте, т. Е. Http://127.0.0.1:8000/person/ohiduzzaman/ –

+0

Затем вы должны показать код для представления, которое служит этому URL-адресу, предположительно это является своего рода DetailView. –

ответ

0

Похоже, у вас есть два пользователя с одинаковым слизнем. Если ваш URL-адрес (который вы не показывали) составляет /person/<slug>/, вам необходимо установить unique=True для вашего поля слизняков.

+0

Мой url: url (r '^ person/(? P [\ w \ -] +)/$', если я использую unique = True, то могу ли я создать такое же name with different birthdate –

+1

Ваши уникальные комбинации для 'name' и' birth_date' не имеют никакого отношения к тому, является ли поле слива уникальным. Если ваш url является '/ person/ohiduzzaman', но у двух человек есть slug' ohiduzzaman', то подробный вид просто не работает. Что вы ожидаете от этого? – Alasdair

+0

В нашем случае имена настолько распространены. Поэтому я хочу ограничить одно и то же имя, если их даты рождения одинаковы, в противном случае я хочу разрешить им отправлять их data. –

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