【Django】makemigrations しようとしたら clash したよというエラーが出た
原因究明できてないけど一応回避はできたのでメモ
試行錯誤しながら model を作成していて、 makemigrations しようとしたら、↓のようなエラーが。
ERRORS:
users.User.foo: (fields.E303) Reverse query name for 'users.User.foo' clashes with field name 'main.Bar.user'.
HINT: Rename field 'main.Bar.user', or add/change a related_name argument to the definition for field 'users.User.foo'.
何かしらでDBに不整合が起こって参照できなくなっているみたい・・・?
この時点でのUserモデルとmain.Barモデルはこちら(実際のものと少し内容変えてます フィールド名など)
users/models.py
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField("email", unique=True)
username = models.CharField("username", unique=True, max_length=40)
foo = models.ManyToManyField(Monster, blank=True)
is_staff = models.BooleanField("is_staff", default=False)
is_active = models.BooleanField("is_active", default=True)
date_joined = models.DateTimeField("date_joined", default=timezone.now)
objects = UserManager()
USERNAME_FIELD = "username"
EMAIL_FIELD = "email"
REQUIRED_FIELDS = ["email"]
class Meta:
verbose_name = "user"
verbose_name_plural = "users"
main/models.py
class Bar(models.Model):
... 略
user = models.ForeignKey('users.User', on_delete=models.PROTECT)
image = models.ImageField(upload_to='image')
...
解決策
言われている通り、main.Barクラスのフィールド名を user → owner にしてみた。
main/models.py
class Bar(models.Model):
... 略
owner = models.ForeignKey('users.User', on_delete=models.PROTECT)
image = models.ImageField(upload_to='image')
...
このあとmakemigrations するとうまくいった
$ python manage.py makemigrations
Did you rename monster.user to monster.owner (a ForeignKey)? [y/N] y # ←yes
Migrations for 'main':
main/migrations/0003_auto_20211221_2131.py
- Rename field user on monster to owner
- Remove field user from record
Migrations for 'users':
users/migrations/0002_user_set_mon.py
- Add field set_mon to user
考察
おそらく、試行錯誤の段階でちょこまかmakemigrations実行したせいでDBがおかしくなった・・・?
user っていうフィールドが使用済みになって使えなくなっているような感じ
↑因果関係が全くつかめてないので憶測でしかない
ただのフィールド名被りならかぶってる元のやつの名前変えても解決しそうだが、、、
かぶり元がどこかわからん
ちょっとよくわからないので今日は寝ます。
鼻水止まらん。