如何在不删除关系中的所有对象的情况下删除多对多对象?

时间:2012-06-29 02:02:14

标签: python django model-view-controller many-to-many

在models.py中,我有......

class Siteinfo(models.Model):
    url = models.CharField(max_length=100)
    description = models.TextField()    

class Makesite(models.Model):
    sitename = models.CharField(max_length=100, unique = True) 
    siteinfo = models.ManyToManyField(Siteinfo)
    ref_id = models.ManyToManyField(RefID)
    def __unicode__(self):
        return u'%s' %(self.sitename)

我正在尝试删除描述的实例并将其替换为另一个实例,并且仍然将其与相同的URL相关联,并且仍然是多对多的对象。集团上。

所以group1是网站名称。创造我拥有的关系

url = request.POST['url']
description = request.POST['description']

datsite = Makesite.objects.get(sitename=site)
datsite.siteinfo.add(Siteinfo.objects.create(url=url,description=description))

但是当我尝试删除并用这段代码替换描述时,它也删除了网址。

name = Makesite.objects.get(sitename=site).siteinfo.values_list('description',flat=True)[0]
Makesite.objects.get(sitename=site).siteinfo.get(description=name).delete()

我想我可以尝试编写一些可以解决这个问题的代码,但我宁愿找到一种方法来删除一个并在其位置添加另一个实例。

1 个答案:

答案 0 :(得分:2)

为了挑剔,您应该使用forms来处理用户输入。

听起来你想要更新一个实例,而不是删除和添加一个几乎完全相同的实例。

site_info = Makesite.objects.get(sitename=site).siteinfo.get(description=name)
site_info.description = "new description"
site_info.save()

或者更简单:

site_info = Siteinfo.objects.get(makesite__sitename=site, description=name) # only 1 query
site_info.description = "new description"
site_info.save()