21

contenttypes フレームワークに関する Django ドキュメントを何度か調べましたが、プロジェクトで一般的な関係を実装するのに十分なほどよく理解していません。この問題に関するオンラインの例やチュートリアルを探しましたが、1 つも見つかりません。私をばかだと呼んでください、しかし、私はこれについて助けが必要です(単にドキュメントにリンクすることで答えないでください). オンラインでのリソースの不足に基づいて、この質問に完全な例で答えると、あなたの答えは django の一般的な関係に関するこれまでのオンラインで最も役立つ例になると思います (おまけ!)。

だから、私の質問は: 誰かがモデルの簡単な例と、一般的なモデルのインスタンスと対話する方法を示す数行のコードを示すことができますか?


インスピレーションとして、これは非常に一般的な状況であると私が信じているものです。

サイトには、ほとんど同じように扱われるメディア アイテムがありますが、わずかに異なります。たとえば、画像と動画のアイテムがあり、ユーザーがアイテムに「いいね」したり、アイテムに「コメント」したりできるとします。いいねやコメントは、画像または動画アイテムに投稿されたかどうかに関係なく、同じように扱われるべきです。したがって、ユーザーのアルバム内の画像またはビデオを表示するための ItemView がある場合、次の種類の呼び出しが可能になります:mediaitem.comments.all()またはlen(mediaitem.likes.all())またはcomment.user_who_commented、それがどの種類のメディア アイテム (画像またはビデオ) であるかを知る必要はありません。

これには6 つのモデルが必要になると思います。

  • 抽象MediaItemクラス
  • 2 つの異なるタイプのメディア アイテム:ImageItemVideoItem
  • 抽象MediaItemActionsクラス
  • メディア アイテムに対して実行できる 2 種類のアクション:LikeおよびComment

この Django 機能の使用方法を知っている場合は、完全な例を示してください! 非常に強力なツールになると思いますので、自分のアプリケーションで使用したいと思っています。明確であればあるほど良い。

4

3 に答える 3

3

実際、私のプロジェクトの 1 つで、さまざまなメディア タイプで非常によく似た状況に陥っています。

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

class ReviewedItem(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    review = models.ForeignKey("Review")

class CreativeWork(models.Model):
  #other fields 
  keywords = generic.GenericRelation("TaggedItem",null=True, blank=True, default=None)
  reviews = generic.GenericRelation("ReviewedItem",null=True, blank=True, default=None)

class MediaObject(CreativeWork):
  #fields
class VideoObject(MediaObject):
  #fields
class AudioObject(MediaObject):
  #fields

すべてのビデオまたはオーディオは、CreativeWork である MediaObject です。CreativeWorks には、タグとレビューへの GenericRelation があります。そのため、何でもタグ付けしたりレビューしたりできます。

必要なのは、「アクション」が ContentType への ForeignKey を持つことだけです。モデルに GenericRelation を追加するよりも。私は実際に django.docs が非常に役立つことを発見しました:)しかし、これが役立つことを願っていません。

于 2015-03-23T15:12:07.473 に答える