2

我正在构建一个 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 关系没有排序)。我已经为此寻找解决方案,并且每个人都指向使用中间模型,使用以下through语句:

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

我怎样才能做到这一点?

4

1 回答 1

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()
于 2013-04-30T01:11:27.880 回答