从具有ManyToMany关系的Django中的查询集列表中删除对象

问题描述:

我在使用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,这就像真的老... –

,如果你的目标是从 '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