6

何らかの方法で「スルー」テーブルと多対多の関係を持つ2つのモデルがありますか?

class Bike(models.Model):
   nickname = models.CharField(max_length=40)
   users    = models.ManyToManyField(User, through='bike.BikeUser')

BikeUserクラス

class BikeUser(models.Model):
   bike     = models.ForeignKey(Bike)
   user     = models.ForeignKey(User)
   comment  = models.CharField(max_length=140)

ユーザーと連携するための機能をBikeクラスに追加したいのですが、これを行うためのベストプラクティスの方法はありますか。Bikeクラスにあまりにも多くのメソッドを追加することを避け、むしろ何らかのマネージャーに作業を任せたいと思います。

何かのようなもの:

bike.bikeusers_set.commonMethod()

また

bike.bikeusers.commonMethod()

これを達成するための最良の方法は何でしょうか?

4

2 に答える 2

7

BikeUserモデルを入手したら、モデルにカスタムマネージャーを追加できます。

何かのようなもの:

class BikeUserManager(models.Manager):
    def commonMethod():
        pass

class BikeUser(models.Model):
   bike     = models.ForeignKey(Bike)
   user     = models.ForeignKey(User)
   comment  = models.CharField(max_length=140)
   objects  = BikeUserManager()

ただし、BikeUserモデルからのみ使用できます。

BikeUser.objects.commonMethod()

このマネージャーを関連マネージャーとして使用する必要があります:http: //docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

use_for_related_fields=Trueをマネージャークラスに追加します。

class MyManager(models.Manager):
    use_for_related_fields = True
于 2010-10-02T14:39:16.460 に答える
0

use_for_related_fieldsはdjango2.0で非推奨になりました。関連フィールドの使用は、ベースマネージャーを介して可能です。

年:

class CustomManager(models.Model):
    use_for_related_fields = True

class Model(models.Model):
    custom_manager = CustomManager()

新着:

class Model(models.Model):
    custom_manager = CustomManager()

    class Meta:
        base_manager_name = 'custom_manager'

例のソース

get_queryset()メソッドの制限について覚えておいてください。

于 2020-05-24T13:53:36.070 に答える