6

私が持っているとします:

class Album(models.Model):
    photos = models.ManyToManyField('myapp.Photo')
    photo_count = models.IntegerField(default = 0)

class Photo(models.Model):
    photo = models.ImageField(upload_to = 'blahblah')

必要なのは、.add() メソッドを呼び出すたびにphoto_countonAlbumクラスをインクリメントするため、.add() メソッドをオーバーライドすることを考えていることです。.add()問題は、メソッド内にあるため、のクラスをインポートできないため、 def->class->def. とにかくオーバーライドすることはあります.add()か?または、これを行うより良い方法はありますか?

4

2 に答える 2

7

django のシグナルを使用して、m2m_changedシグナルを使用してカウンターをインクリメントするシグナル ハンドラーを作成できます。

https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed

于 2012-11-10T11:07:30.160 に答える
0

おそらく最も簡単なオプションは、シグナルをスキップし、photo_count フィールドを完全に削除して、[album].photos.count() を使用する場所で [album].photos.count() を呼び出すことです。

次のように Album のプロパティを定義することもできます。

class Album(models.Model):
    photos = models.ManyToManyField('myapp.Photo')

    @property
    def photo_count(self):
        return self.photos.count()

class Photo(models.Model):
    photo = models.ImageField(upload_to = 'blahblah')

両方のオプションの欠点は、写真の数に基づいて検索/並べ替えが難しくなることです。また、カウントをデータベースに保存しません。(同じ DB と対話している Django 以外のアプリケーションがある場合、それは重要かもしれません。) Django を介してこの種の検索を行いたい場合は、Django アノテーションを調べてください。

これはシグナルを処理するよりも簡単ですが、おそらくやり過ぎです。

于 2014-11-12T23:01:03.810 に答える