Django:ManyToMany能否订购和添加/删除关系?

时间:2013-04-30 00:54:35

标签: python django django-models many-to-many

我正在构建一个Web应用程序,允许用户拥有一个带有照片对象的照片库,这些照片库可以放入相册中。他们可以做到以下几点:

  • 将照片添加到相册
  • 从相册中删除照片
  • 更改相册中照片的顺序
  • 将相同的照片放在多个相册中
  • 多次将照片放入相册

最初,我原本想过写这样的模型(简化):

def Photo(models.Model):
    user = models.ForeignKey(User)
    img_file = models.ImageField(upload_to = img_get_file_path)
    upload_date = models.DateTimeField(auto_now_add = True)


def Album(models.Model):
    title = models.CharField(max_length = 50, required = False)
    cover_img = models.ForeignKey(Photo)
    album_contents = models.ManyToMany(Photo)

#  a user's "photo library" isn't defined in a model, but 
#  rather by running the query: 
#  Photo.objects.filter(user = request.user).order_by('upload_date')

这种简单的方法效果很好,但用户无法更改相册中照片的顺序(ManyToMany relationships未订购)。我已经搜索了一个解决方案,每个人都指着使用through语句使用intermediate models

中间模型方法可用于订购相册中的照片,但用于从相册中删除照片。 Intermediate models不支持.add().create().remove()或转让。他们只支持.clear()方法,这将清除整个专辑。我需要用户能够一次从相册中删除一张照片,同时仍然可以在相册中订购照片。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

你不应该让django删除添加,创建,删除的事实阻止你做任何事情。

仅仅因为它“仅”支持.clear()方法,并不意味着您无法编写正常的python代码来替换该功能。

  

中间模型方法可用于订购相册中的照片,但不能用于从相册中删除照片。中间模型不支持.add(),. create(),. remove()或赋值。它们只支持.clear()方法,它可以清除整个专辑。我需要用户能够一次从相册中删除一张照片,同时仍然可以在相册中订购照片。

我不知道是什么阻止你删除一个关系而不是所有关系。

找到M2M中间表的实例并删除该行。这是一个普通的django模型。

# say you have a photo that the user wants to remove from album.
album = Album.objects.latest('id')
photo = Photo.objects.album_contents.latest('id')

# to remove that m2m relationship...
# delete the through table row which matches said relationship
MyThroughTable.objects.filter(album=album, photo=photo).delete()