3

シナリオは次のとおりです。

サブジェクトモデルと多対多の関係に関連するサブジェクトフィールドを持つ学生モデルがあります

class Student(models.Model):
    (...)
    subject = models.ManyToManyField(Subject)

サブジェクトモデルでは、プログラムモデルとの多対多の関係に関連するプログラムフィールドがあります。サブジェクトモデルにもCharField名が付けられました。

class Subject(models.Model):
    (...)
    program = models.ManyToManyField(Programs)

プログラムモデルには、次のフィールドがあります。

class Programs(models.Model):
    name = models.CharField(max_length=40)
    (...)

Djangoは、多対多のフィールド用に追加のテーブルを作成します。私のアプリケーションでは、プログラムに対応するプログラムとサブジェクトを(フォームを使用して)作成します。次に、いくつかの学生を作成し、いくつかの科目を選択します。プログラム名フィールド(Student.objects.all())にアクセスして、Studentが使用しているプログラム名を表示するにはどうすればよいですか?
それは可能ですか、それともプログラムモデルとの多対多の関係に関連する学生モデルに追加のフィールドを作成する必要がありますか?

4

1 に答える 1

2

Student.subjectの各科目に属するプログラムのプログラム名のリストを返したいと思っているのは正しいですか?

もしそうなら、これをStudentモデルのメソッドとして使用できます。

def get_program_names(self)
    programs = []
    for subject in self.subjects:
        programs += [program.name for program in subject.program]
    return programs

しかし、あなたの質問から、返されるプログラム名は1つだけであると予想しているようです。この場合、manyToManyフィールドをForeignKeyフィールドに置き換える必要があります。これにより、2つのモデル間に1対1の関係が与えられます。つまり、このメソッドは機能するはずです。

def get_program_name(self):
    return self.subject.program.name

(いずれにせよ、データベース呼び出しの数を減らしたい場合を除いて、学生モデルとプログラムモデルの間に直接リンクを作成する必要がある理由はありません。データベース呼び出しの数を減らしたい場合は、次のように更新されるフィールドをStudentに追加できます。最新のプログラム名など。)

私はあなたの質問を誤解していないことを願っています。

于 2012-12-27T12:34:40.897 に答える