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

标签 python django postgresql

在 Django 中使用 ForeignKeyManyToMany 关系时,我无法从对象列表中删除对象。

这是我为项目、列表和订单(中间模型)设置的模型。

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()

我正在通过 View 将对象添加到列表(从现有对象动态创建),如下所示:

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")

现在我的问题是,删除添加到列表中的项目。我无法理解如何访问目标对象。

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()。

请务必将其放入 try: except List.DoesNotExist: 中,以避免人们通过在 URL 中手动输入随机字符串来触发 500 秒。

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

另一种选择是使用“get_object_or_404”函数来检索该项目,如果 URL 中给出的项目不存在,这将引发 http404 异常,我认为这是有道理的。

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

如果您要在特定列表中查找特定项目,则在 URL 和 View 中需要两个参数

网址:

url(r'^(?P<list_id>[\d]+)/(?P<item_id>[\d]+)/delete$', delete, name='whatever')

查看:

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")

关于python - 从 Django 中具有多对多关系的查询集列表中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39353856/

相关文章:

python - 具有可过滤属性的 Django 模型

python - flask 图像未在 html 页面上更新

python - 从文件中删除字符串和字符串之前的所有行

postgresql - Postgres 会自动缓存大表中的 "active"条记录吗?

python - 列表理解导致 "name ... is not defined"错误

python - 查询时在 Django TimeStampedModel 中指定时间间隔

python - 何时在 Django 中创建新应用程序(使用 startapp)?

python - AppConfig.ready() 在 Django 安装程序上运行两次(使用 Heroku)

c++ - SOCI:栏目多了怎么处理?

python migrate (django) 不适用于 postgresql