2016-09-06 70 views
2

我在使用Django中的ForeignKeyManyToMany關係刪除對象列表中的對象時遇到問題。從具有ManyToMany關係的Django中的查詢集列表中刪除對象

以下是我爲項目,列表和訂單(中介模型)設置的模型。

class Item(models.Model): 
    title_english = models.CharField(max_length=250) 
    url = models.CharField(max_length=250) 
    img_url = models.CharField(max_length=250) 

    def __unicode__(self): 
     return self.title_english 

class List(models.Model): 
    slides = models.ManyToManyField(Item, through='Order') 
    size = models.PositiveIntegerField(default=0) 

    def incrementSize(self): 
     self.size = self.size+1 

    def __unicode__(self): 
     return "List: " + str(self.slides.all()) 

class Order(models.Model): 
    item = models.ForeignKey(Item, on_delete=models.CASCADE) 
    list = models.ForeignKey(List, on_delete=models.CASCADE) 
    index = models.PositiveIntegerField() 

    def __unicode__(self): 
     return str(index) + ": " + str(self.item) 

    def appendItemToList(self, item, list): 
     self.item = item 
     self.list = list 
     self.index = list.size 
     list.incrementSize() 

我像這樣將對象添加到列表中(從現有對象動態創建的),通過視圖:

def AddItem(request, pk): 
    sourceObj = SourceObject.objects.get(pk=pk) 
    lst = List.objects.all() 
    if not lst: 
     lst = List() 
     lst.save() 
    else: 
     lst = lst[0] 
    item = Item(title_english=sourceObj.name_english, url=sourceObj.slug, img_url=sourceObj.media) 
    item.save() 
    order = Order() 
    order.appendItemToList(item, lst) 
    order.save() 
    lst.save() 
    return redirect("some_url") 

現在我的問題是,刪除的項目加入到list。我無法理解如何訪問目標對象。

def RemoveItem(request, pk): 
    lst = List.objects.all() 
    lst.delete() #deletes the entire list 
    #how do I access the target object from here to delete it 
    return redirect("some_url") 

我通過Django文檔閱讀指的是「下面的關係倒退」的位置:https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

但是我無法找到一個可行的解決方案。

注:我使用Django 1.5和Python 2.7

+0

該視圖沒有意義,如果你只有一個PK,你怎麼知道要刪除什麼?誰是你的目標? –

+0

我的目標是'項目'。我正在考慮使用QuerySet過濾器來比較'item'的title_english字段和'sourceObj'的title_english字段 - 是否相等;從'list'中刪除'item'。我只是不知道如何訪問'list'中的'items'以 – hammerabi

+0

btw開頭,我剛剛注意到,爲什麼你使用django 1.5?目前的版本是1.10,這就像真的老... –

回答

3

,如果你的目標是從 'PK',你可以只使用List.objects.get(PK).delete()引用的項目。

一定要把這裏面的嘗試:除了List.DoesNotExist:爲了避免人們通過手動輸入URL中的隨機字符串來激起500s。

try: 
    List.objects.get(pk).delete() 
except List.DoesNotExist: 
    do_something_when_item_does_not_exist() 
return redirect("some_url") 

另一種選擇是使用「get_object_or_404」功能檢索項目,這將引發異常HTTP404如果在URL中給出的項目不存在,這是有道理的,我認爲。

item = get_object_or_404(List, pk) 
item.delete() 
return redirect("some_url") 

的情況下,

你正在尋找一個特定項目的具體列表裏,你需要兩個參數在您的網址,並在視圖

網址:

​​

查看:

def delete(request, list_id, item_id): 
    item = get_object_or_404(List, pk=item_id, list_id=list_id) 
    item.delete() 
    return redirect("some_url") 
+0

的優秀答案。我選擇了'get_object_or_404'解決方案,因爲它對我來說似乎更有意義。 – hammerabi

相關問題