0

私はイベントモデルを持っています。イベントには多くの「プレゼンター」がいる場合があります。ただし、各プレゼンターは、2 つの異なるタイプのプロファイルのいずれかを使用できます。プロファイル 1 とプロファイル 2。両方のプロファイルがプレゼンターに入るのを許可するにはどうすればよいですか?

これは 100% バックエンドで作成されます。つまり、管理者は「プレゼンター」を選択します。 (それが重要かどうかはわかりません)。

class Profile1(models.Model):
    user = models.ForeignKey(User, null=True, unique=True)
    first_name = models.CharField(max_length=20, null=True, blank=True)
    last_name = models.CharField(max_length=20, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    about = models.TextField(null=True, blank=True)
    tags = models.ManyToManyField(Tag, null=True, blank=True)
    country = CountryField()
    avatar = models.ImageField(upload_to='avatars/users/', null=True, blank=True)
    score = models.FloatField(default=0.0, null=False, blank=True)
    organization = models.CharField(max_length=2, choices=organizations)

class Profile2(models.Model):
    user = models.ForeignKey(User, null=True, unique=True)
    first_name = models.CharField(max_length=20, null=True, blank=True)
    last_name = models.CharField(max_length=20, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    about = models.TextField(null=True, blank=True)
    tags = models.ManyToManyField(Tag, null=True, blank=True)
    country = CountryField()
    avatar = models.ImageField(upload_to='avatars/users/', null=True, blank=True)
    score = models.FloatField(default=0.0, null=False, blank=True)

...

class Event(models.Model):
    title = models.CharField(max_length=200)
    sub_heading = models.CharField(max_length=200)
    presenters = ManyToManyField(Profile1, Profile2, blank=True, null=True)  ?
    ...
    # I've also tried: 
    profile1_presenters = models.ManyToManyField(Profile1, null=True, blank=True)
    profile2_presenters = models.ManyToManyField(Profile2, null=True, blank=True)
    # is there a better way to accomplish this?...
4

1 に答える 1

3

ここで設計上の問題があると思います。私の意見では、プレゼンターとは何か、「プロファイル 1」のプレゼンターと「プロファイル 2」のプレゼンターの違いは何かを考える必要があります。このモデルで何をするつもりですか?プロファイルは 2 つしかありませんか? 今後、別のプロファイル (「プロファイル 3」) が表示される可能性はありますか? そしてプロフィール4?プロファイル N?

モデルとその関係についてもう一度考えてみることをお勧めします。django admin からこれらのモデルを処理するのがどれほど難しい/簡単かを考えて、この決定を下さないでください。それは別の問題であり、モデルを少し考えれば、これは後で問題にならないに違いありません。

それにもかかわらず、私はあなたが望むものを達成する方法についてアドバイスを与えることができます (または私はそう願っています)。これらの関係をモデル化する方法について考えたら、django でモデルをどのように作成するかを考え始めます。ここにあなた自身に答えなければならないいくつかの質問があります:

プロファイルごとに 1 つの異なるテーブル (SQL を使用する場合) が必要ですか? それに答えられない場合は、次の質問に答えてみてください: 1) 2 つの異なるプロファイルの違いは何ですか? 2) 複数のプロファイルがありますか? 3) 各プレゼンターのプロフィールは 1 つだけですか? このプロパティが近い将来変更される可能性はどのくらいですか?

何が必要かはよくわかりませんが、「プレゼンター」モデルとは別にモデル「プロファイル」を用意するのが最善の方法だと思います。次のようなものかもしれません:

class Profile(models.Model):
    first_profile_field = ...
    second_profile_field = ...

# Each presenter have one profile. One profile can "represent" 
# to none or more presenters
class Presenter(models.Model):
    first_presenter_field = ....
    second_presenter_field = ....
    profile = models.ForeignKey(Profile)


class Event(models.Model):
    presenters = models.ManyToManyField(Presenter)
    ....

これは、モデルをどのように設計できると想像するかの単なるアイデアです。モデルを正しく設計し、私が行った質問に答えたら、役立つリンクがいくつかあります。

https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

https://docs.djangoproject.com/en/dev/misc/design-philosophies/#models

http://www.martinfowler.com/eaaCatalog/activeRecord.html

そして、デザインがどのようになるかを決定したら、管理者と協力して作業します。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/

編集: 私が間違っていなければ、プロファイル 1 フィールドと 2 フィールドの唯一の違いは「組織」フィールドです。私は正しいですか?ほぼ同じなので、両方のモデルをマージすることをお勧めします。それらに異なるメソッドがある場合、または異なるマネージャーなどを追加したい場合は、django モデルのプロキシ オプションを使用できます。たとえば、次のようにできます。

class Profile(models.Model):
    #All the fields you listed above, including the "organization" field


class GoldenProfile(models.Model):
    #you can define its own managers
    objects = GoldenProfileManager()
    ....
    class Meta:
        proxy = True

class SilverProfile(models.Model):
    ....
    class Meta:
        proxy = True

このようにして、モデルごとに異なるメソッドを定義したり、同じメソッドを異なる動作で定義したりできます。それらに独自のマネージャーなどを与えることができます。

そして、イベント クラスは次のように維持する必要があります。

class Event(models.Model):
    title = models.CharField(max_length=200)
    sub_heading = models.CharField(max_length=200)
    presenters = ManyToManyField(Profile, blank=True, null=True)

それが役に立てば幸い!

于 2012-06-07T04:13:35.183 に答える