2009-12-31 22 views
1

我有刪除我的對象的問題。我寫了一個刪除方法,獲取要刪除的對象的ID列表。這對於對象和具有外鍵的對象來說工作正常,但如果我與要刪除的對象有OneToOneField關係,則失敗。django刪除問題 - 刪除多個對象與一個OneToOneField關係 - 得到MultipleObjectsReturned錯誤

這是我的刪除方法:

@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關係。如果沒有將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文檔閱讀

deleting objects

說:「其中有外鍵的對象指向任何對象被刪除將隨着它一起被刪除。「這是我想要完成的目標..但現在我得到一個錯誤。我想要的是要刪除的對象:D

其實這可能是一個設計問題?當我將多個PhoneNumber對象與OneToOneField關係聯繫到一個Contact對象時,是否是錯誤的?我選擇了OneToOneField,因爲電話號碼是唯一的,應該只與一個聯繫人有關。

回答

3

當我將多個PhoneNumber對象與具有OneToOneField關係的Contact對象相關聯時,它是錯誤的嗎?

你猜對了。將關係更改爲PhoneNumber中的外鍵,併爲PhoneNumberField設置unique選項。

應該結束了這樣的:

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

+0

接過話語權失控我的嘴:) – elo80ka 2009-12-31 23:33:30

+0

:d救了我的一天。它現在有效。我認爲OneToOneField關係錯誤。我只是想確保沒有其他聯繫人可以與同一個PhoneNumber對象相關聯。但這與ForeignKeys正常工作。 OneToOne關係可以定義OneToOne關係,就像名稱告訴我們的那樣;-)謝謝大家! – 2009-12-31 23:49:20