質問: models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return str(self.user) ``` このコードですと各ユーザーに必ず1つのイベントカテゴリー名が制御できません。 forms.pyなどで制御するしかないのでしょうか? どなたかお力添えよろしくお願いします。 それともう一つ質問があります。 ForeignKeyのon_delete=models.CASCADEとはどう云う意味なのでしょうか?
回答: 確認です。 ユーザが ・taro ・ziro ・saburo と存在し、EventCategoryに ・Event1 ・Event2 ・Event3 とあった場合に、taroがEvent1を選び登録するとziro、saburoがEvent1を選べない、 という動作でしょうか。 その場合でしたら、 ``` user = models.OneToOneField(User, on_delete=models.CASCADE) ``` のように、categoriesとuserのForeignKeyを、OneToOneFieldにするといかがでしょうか。 ForeignKeyのon_delete=models.CASCADEについてですが、これはForreignKeyとして指定しているオブジェクトが削除された際にどうするか?という挙動になります。 例えば以下のようなモデルあったとして ``` from django.db import models class Category(models.Model): """カテゴリ""" name = models.CharField(max_length=255) def __str__(self): return self.name class Post(models.Model): """記事""" title = models.CharField(max_length=255) text = models.TextField() category = models.ForeignKey(Category, on_delete=models.CASCADE) def __str__(self): return self.title ``` カテゴリに「食べ物」があったとします。 記事を100記事ほど作り、全て記事のカテゴリは食べ物を指定します。 この後、「食べ物」カテゴリを削除すると、「食べ物」カテゴリを選択した100記事も一緒に削除されてしまいます。これは、on_delete=models.CASCADEの挙動です。(on_deleteのデフォルトはmodels.CASCADE) このような場合に、 ・PROTECT (削除できないように保護する) ・SET_NULL (nullを入れる。null=True、等と指定しておかなくてはいけません) ... などで挙動が変更できます。 2016/09/27 17:30追記 ご返信ありがとうございます、承知しました。 では、ChooseEventモデルを以下のように変更するといかがですか。 追加したのは、class Metaのunique_togetherです。 ``` class ChooseEvent(TimeStampedModel): categories = models.ForeignKey(EventCategory, on_delete=models.CASCADE) area_list = models.ForeignKey(Area, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) # ここを追加! class Meta: unique_together = ('categories', 'user',) def __str__(self): return str(self.user) ``` これですと、taroがEvent1を一度選び保存すると、次回以降taroはEvent1で新たに保存しようとすると エラーとなります。 いかがでしょうか。