2017-05-10 17 views
1

Djangoモデルで一対多と多対多の関係がどのように機能するかを理解するのは苦労しています。私のスキーマは今のところこれに似ていますが、私はそれをより良くするための提案をしています。Djangoモデルの関連フィールドをすべて取得する

enter image description here

ユーザーとチーム間の多対多の関係。また、チームの特定のユーザーに属するスケジュールもあります。

これは私のモデルは、これまでにどのように見えるかで、

class Team(models.Model): 
    tid = models.AutoField(primary_key=True) 
    team_name = models.CharField(max_length=30) 
    manager_name = models.CharField(max_length=30) 

class Schedule(models.Model): 
    sid = models.AutoField(primary_key=True) 
    user = models.OneToOneField(User) 
    date = models.DateField() 
    start_time = models.TimeField() 
    end_time = models.TimeField() 
    pay_rate = models.CharField(max_length=30) 
    location = models.CharField(max_length=50) 

class BelongsTo(models.Model): 
    bid = models.AutoField(primary_key=True) 
    user = models.OneToOneField(User) 
    team = models.ForeignKey(Team, on_delete=models.CASCADE) 
    schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE) 

質問:自分のスケジュールとそのチーム各スケジュールが属している私は、各ユーザーの情報を取得したい、。私はそれをどうやってやるのだろう?私はBelongsTo.objects.select_related().all()を試しましたが、それは私のために働いていません。

注:私は提案があります。スキーマやモデルやアプローチに問題がある場合は、教えてください。

答えて

1

BelongsToさは、あなたのスキーマはほとんど右に見えますが、私はそれを少し修正するでしょうtable.So

BelongsTo.objects.all().values('user', 'team__team_name', 'schedule') 
+0

それは私にエラーを与えます。 'キーワード 'team_name'をフィールドに解決できません。選択肢は:belongssto、manager_name、team_name、tid' –

+0

申し訳ありませんが、間違えて、間にスペースを削除 – itzMEonTV

+0

私はそれが働いたと思います! :)私は最良の答えとしてそれを選択する前に、いくつかの他のフィールドでそれをテストしてみましょう。ありがとう! –

0

ユーティリティのように思えます。特に、Scheduleの実装方法を変更します。 User Belongs Toジョイン・テーブルにsidを置く代わりに、ユーザとチームを外部キーとしてScheduleテーブルに含めます。あなたはDjangoが追加されますので、モデルの主キーフィールドを持っている必要はありません

  1. :以下

    class User(models.Model): 
        username = models.CharField(max_length = 200) 
        # put other fields like password etc. here 
    
    class Team(models.Model): 
        team_name = models.CharField(max_length=30) 
        manager_name = models.CharField(max_length=30) 
        user = models.ManyToManyField("User") 
    
    class Schedule(models.Model): 
        user = models.ForeignKey("User") 
        team = models.ForeignKey("Team") 
        date = models.DateField() 
        start_time = models.TimeField() 
        end_time = models.TimeField() 
        pay_rate = models.CharField(max_length=30) 
        location = models.CharField(max_length=50) 
    

    注:

    この

    はDjangoのモデルは、その後のようになります方法です主キーフィールドはpkまたはidと自動的に呼び出されます。
  2. User Belongs Toモデルがないことに注意してください。 DjangoはManyToManyFieldを使うと自動的にUser Belongs Toのような結合テーブルを実装します。 Django docs on many-to-many relationshipsを参照してください。
  3. ForeignKeyフィールドにはon_delete = models.CASCADEも必要ありません。これはデフォルト動作であるためです。

このモデルの設定からユーザー、チーム、スケジュールに関する情報を取得する方法については、Django documentation on making db queriesを参照してください。それは非常に簡単です。

+0

各ユーザーのすべてのスケジュールをどのように照会すればいいですか?このようなもの、 'Schedule.objects.select_related()。all()'? –

+0

この 'martin = User.objects.get(username =" martin ")'のようにしてから 'schedules_of_martin = Schedule.objects.filter(user = martin)'を実行してください。 [Djangoのdbクエリ作成に関するドキュメント](https://docs.djangoproject.com/en/1.11/topics/db/queries/)を読むことを強くお勧めします。それは読んでほんの10分かかりますし、その後、プロのようなdbクエリを作成します。 –

関連する問題