django删除问题 - 使用OneToOneField关系删除多个对象 - 得到MultipleObjectsReturned错误

时间:2009-12-31 22:36:29

标签: django django-models

我在删除对象时遇到问题。我写了一个删除方法,它获取要删除的对象的ID列表。这适用于对象和具有外键的对象,但如果我与要删除的对象具有OneToOneField关系,则会失败。

这是我的删除方法:

@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

直到现在我才用Contact对象测试它。现在我在我的模型中添加了PhoneNumber模型。 PhoneNumber模型与Contact模型具有OneToOneField关系。如果没有PhoneNumber对象或一个PhoneNumber对象分配给Contact对象,我可以删除它。但是,如果我将多个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}

我在django docs中读到了

deleting objects

“任何具有指向要删除的对象的外键的对象都将随之删除。”这是我想要完成的目标..但现在我得到了一个错误。我想要的只是要删除的对象:D

实际上这可能是一个设计问题?当我将多个PhoneNumber对象与具有OneToOneField关系的Contact对象相关联时,是不是错了?我选择了OneToOneField,因为电话号码是唯一的,并且只与一个联系人有关。

1 个答案:

答案 0 :(得分:3)

  

将多个PhoneNumber对象与具有OneToOneField关系的Contact对象关联时是不是错了?

你明白了。将关系更改为PhoneNumber中的外键,并为unique设置PhoneNumberField选项。

应该这样结束:

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

此外,只是为了确保我了解您希望如何设置约束:此示例假定电话号码只会在整个数据库中出现一次,因此只有一个联系人可以拥有该电话号码。

如果您想要限制性较小的内容,请在模型的Meta选项中使用unique_together,如下所示:

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