2009-12-31 1 views
1

У меня проблема с удалением объектов. Я написал метод удаления, который получает список идентификаторов объектов, которые нужно удалить. Это отлично работает для объектов и объектов с внешними ключами, но это не удается, если у меня есть отношение OneToOneField к объекту, который я хочу удалить.Проблема с удалением django - удаление нескольких объектов с помощью отношения OneToOneField - получено MultipleObjectsReturned error

Это мой метод удаления:

@login_required 
def delete_objects(request, model, selected_ids): 
    ''' 
    capsulate a bulk delete method 
    delete all objects found for the given model 
    fails silently since model.delete() always fails silently 
    ''' 
    object_list = model.objects.filter(pk__in=selected_ids) 
    count = object_list.count() 
    if count == 1: 
     name = model._meta.verbose_name.title() 
    else: 
     name = model._meta.verbose_name_plural.title() 
    object_list.delete() 
    request.user.message_set.create(message='Successfully deleted %s %s' % (count,name)) 
    return 

До сих пор я просто проверял, контактирующие с объектами. Теперь я добавил модель PhoneNumber для своих моделей. Модель PhoneNumber имеет отношение OneToOneField к модели Contact. Если объекту ContactNumber не присвоен объект PhoneNumber или один объект PhoneNumber, я могу его удалить. Но если я связываю более одного объекта PhoneNumber с объектом Contact, я получаю сообщение об ошибке.

Это сообщение об ошибке, что я получаю:

MultipleObjectsReturned at /crm/contacts/ 
get() returned more than one PhoneNumber -- it returned 3! Lookup parameters were {'contact__pk': 4L} 
Request Method: POST 
Request URL: http://127.0.0.1:8000/crm/contacts/ 
Exception Type: MultipleObjectsReturned 
Exception Value:  
get() returned more than one PhoneNumber -- it returned 3! Lookup parameters were {'contact__pk': 4L} 

Я прочитал в Джанго документы

deleting objects

, что «любые объекты, которые имели внешние ключи, указывающие на объект, чтобы исключить будут удалены вместе с ним ». Это цель, которую я хочу выполнить, но теперь я получаю сообщение об ошибке. Все, что я хочу, это объекты, которые необходимо удалить: D

На самом деле это может быть проблема с дизайном? Неправильно ли, когда я связываю более одного объекта PhoneNumber с объектом Contact с отношением OneToOneField? Я выбрал OneToOneField, так как номер телефона уникален и должен быть связан только с одним контактом.

ответ

3

Неправильно, когда я связываю более одного объекта PhoneNumber с объектом Contact с отношением OneToOneField?

У вас есть это. Измените связь с внешним ключом в PhoneNumber и установите опцию unique для PhoneNumberField.

Если в конечном итоге, как это:

class PhoneNumber(models.Model): 
    # some fields... 
    number = PhoneNumberField(unique=True) 
    contact = models.ForeignKey(Contact, related_name="phone_numbers") 

Кроме того, просто чтобы убедиться, что я понимаю, как вы хотите ограничения настройки: В этом примере предполагается, что номер телефона будет отображаться только один раз во всей базе данных, и, следовательно, также, что только один контакт может иметь этот номер телефона.

В случае, если вы хотите что-то менее ограничительное, используйте unique_together в настройках Meta этой модели так:

class PhoneNumber(models.Model): 
    # some fields... 
    number = PhoneNumberField() 
    contact = models.ForeignKey(Contact, related_name="phone_numbers") 

class Meta: 
    unique_together = ("number", "contact") 

Это позволит несколько контактов, чтобы иметь один и тот же номер телефона, но один контакт не может иметь этот номер более чем один раз.

http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

+0

Взял слова прямо сбился мне рот :) – elo80ka

+0

: D, который спас мой день. Он работает сейчас. Я неправильно понял отношения OneToOneField. Я просто хотел убедиться, что никакой другой Контакт не может относиться к одному и тому же объекту PhoneNumber. Но это отлично работает с ForeignKeys. OneToOne Отношения там, чтобы определить OneToOne Отношения, как название говорит нам ;-) Спасибо, ребята! –

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