44050


Djangoのmodel作成で、ForeignKeyを指定して外部キーを参照したいのですが、  
うまくいきません。

[ファイル構成概略]  
App  
|  
|-base - models.py  
|  
|-dir1 - models.py  
|-dir2 - models.py  
(dirはこのほかにいくつかあります。)

[base/models.py]

[code]

    from django.db import models
    from django.contrib.auth.models import User
    from django.db import models
    from django.contrib.auth.models import User
    
    class BaseModel(models.Model):
        class Meta(object):
            abstract = True
            ordering = ('pk', )
    
        user_creating = models.ForeignKey(
            User,
            related_name='user_creating_id',
            on_delete=models.CASCADE
        )
        user_updating = models.ForeignKey(
            User,
            related_name='user_updating_id',
            on_delete=models.CASCADE
        )
    
[/code]

[dir1/models.py]

[code]

    class ClinicRecords(BaseModel):
        """カルテ情報."""
    
        patient = models.Foreignkey(User, on_delete=models.CASCADE)
        height = models.IntegerField()
        (略)
    
[/code]

[dir2/models.py]

[code]

    class Photos(BaseModel):
        """写真情報."""
    
        clinic_record = models.ForeignKey(ClinicRecords, on_delete=models.CASCADE)
        patient_status = models.IntegerField()
        head_image = models.URLField()
        (略)
    
[/code]

上記のように  
・dir1,dir2のmodels.pyの中で BaseModelを継承する  
・BaseModelではさらに、「Userモデル」を外部キーとしてリレーションしたい

この際、

[code]

    HINT: Add or change a related_name argument to the definition for 
    '（クラス名１）.user_updating' or '（クラス名２）.user_updating'.
    　　　　（クラス名１）.user_updating: (fields.E305) Reverse query name for
     '（クラス名２）.user_updating' clashes with reverse query name for '（クラス名３）.user_updating'.
    
[/code]

というエラーが出ます。

原因は明らかに  
dir1やdir2のmodels.pyで継承している、親クラス：BaseModelの中でForeignKeyを使ってUserを呼び出しているからであることがわかっているのですが、この解決策がわかりませんでした。  
こちらの解決策をご教示いただけますでしょうか。


CC BY-SA 4.0
2018-05-17T09:13:51.747
44039
2018-05-18T02:33:22.887
28550
question
python django
Django：model作成における継承について


[`%(class)s`](https://docs.djangoproject.com/ja/2.0/topics/db/models/#be-
careful-with-related-name-and-related-query-
name)と[`%(app_label)s`](https://docs.djangoproject.com/ja/2.0/topics/db/models/#be-
careful-with-related-name-and-related-query-name)を使えばどうですか？

> ForeignKey もしくは ManyToManyField に対して related_name または related_query_name
> を使う場合、そのフィールドに対して 一意の
> 逆引き名およびクエリ名を常に定義しなければなりません。これは抽象基底クラスにおいて、フィールドが継承した子クラスそれぞれに含まれ、継承される毎にその属性値が完全に同じ値
> (related_name と related_query_name も含む) となるため、通常問題となります。
>
> この問題に対処するため、抽象基底クラスにおいて related_name もしくは related_query_name
> を用いる場合(のみ)、その値の一部に '%(app_label)s' と '%(class)s' を含まなければなりません。

例えば、

[code]

    user_updating = models.ForeignKey(
        User,
        related_name='%(app_label)s_%(class)s_user_updating_id',
        on_delete=models.CASCADE
    )
    
[/code]


CC BY-SA 4.0
2018-05-18T02:33:22.887
44050
2018-05-18T02:33:22.887
2020-06-17T08:14:45.997
-1
28558
44039
answer