0

最も便利なdjangoフレームワークの1つについて少し質問します。

django.contrib.sites

私がモデルを持っていると仮定すると:

class MyModel(models.Model):
    info = models.TextField()
    site = models.ManyToManyField(Site)
    objects = models.Manager()
    on_site = CurrentSiteManager()

上記にリンクされている別のモデル:

class MyModelSupplement(models.Model):
    info = models.TextField()
    parent_model = models.ForeignKey(MyModel)

スキームは、MyModelSupplementがサイトに属することはできず、その親はに属さないことを指定しています。

この構造を使用すると、呼び出すだけで、指定されたサイトのMyModelオブジェクトにアクセスできます。

MyModel.on_site.all()
コード。MyModelSupplementモデルで同じことを達成するための最良の方法は何ですか?

私はこれを解決するためのいくつかの方法を考えることができます:

  1. MyModelSupplementに同じサイトフィールドを配置し、同じCurrentSiteManagerを定義します(少し冗長になりませんか?)
  2. 使用するMyModelSupplement.objects.filter(parent_model__site__id = some_site_id)
  3. MyModel.on_site.all().values_list('mymodelsupplement')
  4. または、このバリアントに移動することもできます。
my_models = MyModel.on_site.all()      
my_models_supplements = MyModelSupplements.objects.filter(parent_model__in = my_models).select_related()

上記のタスクを実行するためのより良い方法はありますか?注意は、特定のサイトに関して尊重されているインスタンスを取得しようとして、この両方のモデルに一緒に、または別々にアクセスする必要があるということです。

たぶん、次のように言う方法があります:からのすべてのSiteID値はMyModelにある必要がありMyModelSupplementます。SiteID値がインスタンスから削除された場合は、ManyToMany関係を持つ、尊重されるインスタンスに関連するMyModelすべての値から削除する必要があります。MyModelSupplementsMyModel

それは達成可能ですか?

4

1 に答える 1

0

私はこの問題を次の方法で解決することができました:

これはすべてが起こる前に行われます:

from django.conf import settings

その後、カスタムマネージャーを作成します。

class OnSiteMyModelSupplementManager(models.Manager):
    def get_query_set(self):
        return super(OnSiteMyModelSupplementManager, self).get_query_set().filter(parent_model__sites=settings.SITE_ID)

さらに2行のコードをMyModelSupplementクラスに追加するだけです。

objects = models.Manager()
on_site = OnSiteMyModelSupplementManager()

これで、親と同じように、現在のWebサイトにのみ属するMyModelSupplementsを取得できるようになりました。

于 2013-03-23T05:11:53.550 に答える