我正在构建一个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()
方法,这将清除整个专辑。我需要用户能够一次从相册中删除一张照片,同时仍然可以在相册中订购照片。
我怎样才能做到这一点?
答案 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()