我在删除对象时遇到问题。我写了一个删除方法,它获取要删除的对象的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中读到了
“任何具有指向要删除的对象的外键的对象都将随之删除。”这是我想要完成的目标..但现在我得到了一个错误。我想要的只是要删除的对象:D
实际上这可能是一个设计问题?当我将多个PhoneNumber对象与具有OneToOneField关系的Contact对象相关联时,是不是错了?我选择了OneToOneField,因为电话号码是唯一的,并且只与一个联系人有关。
答案 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