0

私はDjangoでプロジェクトを書いています。そこでは5種類のユーザーグループがあります。

  • グループ1
  • グループ2
  • ..。

次に、ユーザーと多くの関係を持つモデル、アイテムがあります。アイテムには、1人の所有者(Group1のユーザー)、顧客(Group2のユーザー)、および多くのRelatedUser(Group3のユーザー)があります。

この関係を書く正しい方法はどれかと思います。私は次のようなものを書きたいです:

class Item(models.Model):
    owner = models.ForeignKey(Owner)
    customer = models.ForeignKey(Customer)
    users = models.ManyToManyField(RelatedUser)

何らかの方法でOwner、Customer、RelatedUserクラスを定義しました。

私はこれを達成する方法がわかりません。テーブルUserが必要なだけなので、モデルの継承は使用しません。マネージャーでさえ私を助けていないようです。実際、私は次のようなものを使用しています。

try:
    customer = models.ForeignKey(User,
                              related_name='cust',
                              limit_choices_to = {'groups__in': [Group.objects.get(name = 'customers')]})
except:
    customer = models.ForeignKey(User,
                              related_name='cust')

主な理由は、フォームを開始するときに空のデータベースグループ「customers」が存在せず、エラーが発生するためです。

これを買う余裕がある正しい方法はどれですか?

前もって感謝します

4

1 に答える 1

0

ユーザータイプごとに個別のモデルを定義できます。それぞれにForiegnKeytoUserがあります。利点は単純さですが、欠点は、このアプローチでは複数のテーブルが追加されることであり、後でグループを追加する必要がある場合は特に拡張できません。

もう1つのオプションは、グループモデルを定義することです。このモデルは、使用可能なさまざまなタイプのグループを格納し、ユーザーと多対多の関係を持ちます(1人のユーザーが複数のグループに属することができると想定)。

グループモデルのフィクスチャを作成することにより、新しいデータベースから開始するときにグループが定義されていないという問題を回避できます。フィクスチャは、自動または手動でDBに簡単にロードできるデータのセットを定義するテキストファイル(デフォルトはJSON形式)です。器具は、 dumpdata管理コマンドを使用して既存のデータから簡単に作成できます。

フィクスチャを自動的にロードする場合(syncdbを実行する場合)、fixturesアプリにディレクトリを作成し、フィクスチャに名前を付けますinitial_data。他のフィクスチャを作成し、コマンドを使用してロードすることも、特定のリストをloaddata指定してテストでロードすることもできます。fixturesTestCase

于 2010-06-02T15:54:30.943 に答える