从具有ManyToMany关系的Django中的查询集列表中删除对象
我在使用Django中的ForeignKey
和ManyToMany
关系删除对象列表中的对象时遇到问题。从具有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
,如果你的目标是从 '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")
的优秀答案。我选择了'get_object_or_404'解决方案,因为它对我来说似乎更有意义。 – hammerabi
该视图没有意义,如果你只有一个PK,你怎么知道要删除什么?谁是你的目标? –
我的目标是'项目'。我正在考虑使用QuerySet过滤器来比较'item'的title_english字段和'sourceObj'的title_english字段 - 是否相等;从'list'中删除'item'。我只是不知道如何访问'list'中的'items'以 – hammerabi
btw开头,我刚刚注意到,为什么你使用django 1.5?目前的版本是1.10,这就像真的老... –