3

私はDjangoでWebサービスに取り組んでおり、解決できない非常に具体的で複雑な関係をモデル化する必要があります。

3つの一般的なモデルを想像してみてください。それらをサイト、カテゴリ、アイテムと呼びましょう。各サイトには1つまたは複数のカテゴリが含まれていますが、2つの可能な方法のいずれかでそれらに関連付けることができます。1つは「共通」カテゴリであり、多対多の関係にあります。これらは事前定義されており、各サイトはゼロに関連付けることができます。以上のカテゴリ、またはその逆。他のタイプのカテゴリはサイトごとに個別に定義され、そのようなカテゴリの1つはそのサイトにのみ「属し」、他のカテゴリには属しません。つまり、各サイトにはこれらのカテゴリがいくつかある可能性があるため、これらは多対1の関係にあります。

内部的には、これら2つのタイプのカテゴリは完全に同一であり、サイトとの関連性が異な​​るだけです。ただし、それらを2つの異なるモデル(おそらく共通の親モデルを使用)に分離することはできますが、それは私の問題の半分しか解決しません。アイテムモデルはカテゴリと多対1の関係にあります。つまり、各アイテムはに属します。カテゴリは1つだけで、理想的には、サイトとの関係を気にする必要はありません。

別の解決策は、2つの異なるタイプのサイト-カテゴリ関係を共存させることです(つまり、同じカテゴリモデルにForeignKeyフィールドとManyToManyフィールドの両方を含める)が、このソリューションは、他のワームの缶全体を開くように感じます。

この行き止まりに対する3番目のより良い解決策があるかどうか誰かが考えていますか?

4

3 に答える 3

4

1つのモデルに両方のタイプのカテゴリがあるのに、3つのモデルしかないのはなぜですか?

Site

Category
  Sites = models.ManyToManyField(Site)
  IsCommon =   models.BooleanField()

Item
  Category = models.ForeignKey(Category)

「内部的には、これら2つのタイプのカテゴリは完全に同一です」と言います。だから、このような音で可能です。ManyToManyFieldが1つの値しかないことは完全に有効であるため、面倒なように聞こえる「同じカテゴリモデルのForeignKeyとManyToManyフィールド」は必要ありません。ManyToManyフィールドに値を1つだけ入力する

于 2009-06-27T18:17:36.910 に答える
1

代替の実装として、アイテムの接続を実現するためにdjangoコンテンツタイプ(ジェネリックリレーション)を使用できます。この実装を使用することの利点は、将来のデータニーズに応じて、さまざまな方法でカテゴリモデルを利用できることです。

カテゴリをプルおよびソートするためのモデルメソッドを作成することにより、サイトカテゴリの使用を容易にすることができます。Djangoのcontribadminは、一般的なリレーション関係のインラインもサポートしています。

モデルは次のようになります。

Site(models.Model):
  label = models.CharField(max_length=255)

Category(models.Model):
  site = models.ManyToManyField(Site)
  label = models.CharField(max_length=255)

SiteCategory(models.Model):
  site = models.ForeignKey(Site)
  label = models.CharField(max_length=255)

Item(models.Model):
  label = models.CharField(max_length=255)
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = generic.GenericForeignKey('content_type', 'object_id')

コンテンツタイプの詳細なレビューと、一般的な関係をクエリする方法については、次を参照してください。 http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/

于 2009-06-29T23:24:52.030 に答える
0

警告:オブジェクトリレーションマッピング、Rails、Pythonは知っていますが、Djangoは特に知りません。

2つの追加オプションがあります。

  1. データベースの観点から考えると、多対多の関係に必要なテーブルに、「共通」と「サイト」の関係を示す追加のフィールドを保持させ、「サイト」の関係のタイプを制限する制約を追加することができます。これは、Djangoの「多対多の関係に関する追加フ​​ィールド」のセクションで実行できると思います。

以前のバージョンのDjangoを使用している場合でも、many-many-tableを明示的なモデルにすることでこれを行うことができます。

  1. オブジェクトの観点から考えると、カテゴリを3つのクラスに分割することがわかりました。

    BaseCategory

    CommonCategory(BaseCategory)

    SiteCategory(BaseCategory)

次に、Djangoの継承モデルの1つを使用します。

于 2009-06-27T20:08:51.877 に答える