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()していません。彼らは、アルバム全体をクリアする方法のみをサポートしています。アルバム内の写真を注文しながら、一度に 1 枚の写真をアルバムから削除できるようにする必要があります。.create().remove().clear()

どうすればこれを達成できますか?

4

1 に答える 1

4

django が add、create、remove を削除するという事実によって、何かをするのを思いとどまらせてはなりません。

メソッドが「のみ」サポートされているからといって、.clear()通常の Python コードを記述してその機能を置き換えることができないわけではありません。

中間モデルのアプローチは、アルバム内の写真の順序付けには機能しますが、アルバムからの写真の削除には機能しません。中間モデルは、.add()、.create()、.remove()、または割り当てをサポートしていません。アルバム全体をクリアする .clear() メソッドのみをサポートします。アルバム内の写真を並べ替えながら、一度に 1 枚の写真をアルバムから削除できるようにする必要があります。

すべての関係ではなく、1 つの関係を削除することを妨げている理由はわかりません。

M2M 中間テーブルのインスタンスを見つけて、行を削除するだけです。通常のジャンゴモデルです。

# 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 に答える