2

序文: 私は django と db 設計は初めてです。

スーパー編集: いくつかの重要な変更を行ったので、変更前の回答はここにないものを参照している可能性があります。謝罪します。

コードに取り掛かります: models.py:

class Player(models.Model):
    name = models.CharField()

class Team(models.Model):
    name = models.CharField()
    members = models.ManyToManyField(Player, through='Membership')

class Word(models.Model):
    word = models.CharField(unique=True)
    definition = models.CharField()
    ...

class Ownership(models.Model):
    owner = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    word = models.ForeignKey(Word)

class Membership(models.Model):
    team = models.ForeignKey(Team)
    player = models.ForeignKey(Player)

Word テーブルが作成されました。admin で Player を作成します。次に、チームを作成してメンバーを追加します。管理者に所有権を追加しました。私は新しい所有権を作成し、選手、チーム、言葉から選ぶことができます。プレーヤーが特定のチームの単語を所有している場合、そのチームに属するプレーヤーはチーム内でその単語を所有できないという制約を付けたいと思います。彼らは他のチームでその言葉を所有しているかもしれません。

今のやり方。同じチームの 2 人の異なるプレイヤーが同じ単語を所有している可能性があります。悪い。基本的に、私は管理者に、このチーム内で所有されているすべての単語を取得し、ドロップダウンで利用可能にしないように言ってもらいたい.

この関係をどのようにモデル化できますか? 管理者でこの機能を取得するにはどうすればよいですか?

編集:別の問題を解決しようとしていることを示すために、メンバーシップ モデルを追加しました。そして、私が言ったように、これは私が実際に取り組んでいることの単純化された例です. ご覧のとおり、メンバーシップの関係が完了したので、別の所有権の問題を解決しようとしています。

4

1 に答える 1

3

スキーマが正しくありません。Django docs でここに見られるように、「多対多関係の追加フィールド」を利用する必要があります。

ここでもSOで強調表示されています。

unique_together「チーム番号」の関連付けを調べてください多対多アプローチの追加フィールドと組み合わせて機能するかどうかはわかりません。それ以外の場合は、ビューで一意性を強制できますが、unique_togetherあなたの場合はうまくいくと思います。

1 ~ 99 の制限については、これをフォームの検証に含めるだけでよく、一意性チェックと組み合わせて、1 ~ 99 の数字を格納するためだけにテーブル全体は必要ありません。

編集の更新

あなたが実際に私の投稿を読んだり、私のリンクをたどったりしたかどうかはわかりませんが、問題を正しく説明していない限り、あなたが説明した問題を正確に解決します. 数値の「所有権」は、モデル化する必要があるものではなく、それが属する場所で表現する必要があります。

class Player(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Team(models.Model):
    name = models.CharField(max_length=128)
    players = models.ManyToManyField(Player, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    player = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
    number = models.IntegerField()
    """ ... """

    class Meta:
        unique_together = ('team', 'number')

プレーヤー-チーム-番号の関連付けに所有権モデルが必要な理由をもう一度説明してください。私がすでに提供したものとは別に、あなたが何を達成しようとしているのか正確にはわかりません.

于 2009-07-23T17:05:59.193 に答える