

python3,Djangoでwebシステムを開発しています。

その中で、同じ項目のmodelのクラスを複数作る必要があり、効率的な方法を考えております。  
良い方法がありましたら、教えていただけないでしょうか？

例えば）下記のような都道府県の情報のクラスを作るようなケースです。  
都道府県の数クラスを作りますが、各クラスの違いはクラスの名前だけです。  
作成後に、makemigrations, migrateを行います。

[code]

    class Hokkaido(models.Model):
        namae = models.CharField('namae', max_length=10)
        zinkou = models.CharField('zinkou', max_length=10)
        menseki = models.IntegerField('menseki')
    
    
        def __str__(self):
            return (self.namae)
    
    
    class Akita(models.Model):
        namae = models.CharField('namae', max_length=10)
        zinkou = models.CharField('zinkou', max_length=10)
        menseki = models.IntegerField('menseki')
    
    
        def __str__(self):
            return (self.namae)
    
    #このようなクラスが、都道府県数つくられる。
    
[/code]

for分を使った方法が、ぱっと思い浮かびます。  
例えば）下記のようなケース

[code]

    todohuken = ['Hokkaido', 'Akita', 'Iwate']
    
    for i in range(len(todohuken)):
    
        class todohuken[i](models.Model):#←class名を配列を使って指定したい
            namae = models.CharField('namae', max_length=10)
            zinkou = models.CharField('zinkou', max_length=10)
            menseki = models.IntegerField('menseki')
    
            def __str__(self):
                return (self.namae)
    
[/code]

この場合だと、エラーが出てしまいます。  

* * *

【コメントをいただいた後の追記】

質問時に載せたコードは、質問用としてサンプルで作成しました。  
下記のコードが実際に使用する予定もモデルのクラスの内容です（。  
各クラスの内容は、CSVよりデータをインポートして作成します。

[code]

    class HokkaidoSapporo(models.Model):
    
        pref_no = models.PositiveIntegerField('pref_no', default=1)
        block_no = models.PositiveIntegerField('block_no', default=101)
    
        date = models.DateField('date')
        ave_temp = models.FloatField('ave_temp')
        max_temp = models.FloatField('max_temp')
        min_temp = models.FloatField('min_temp')
        rain = models.PositiveIntegerField('rain')
        sun = models.FloatField('sun')
        weather = models.CharField('weather', max_length=10)
    
    class HokkaidoAsahikawa(models.Model):
    
        pref_no = models.PositiveIntegerField('pref_no', default=1)
        block_no = models.PositiveIntegerField('block_no', default=102)
    
        date = models.DateField('date')
        ave_temp = models.FloatField('ave_temp')
        max_temp = models.FloatField('max_temp')
        min_temp = models.FloatField('min_temp')
        rain = models.PositiveIntegerField('rain')
        sun = models.FloatField('sun')
        weather = models.CharField('weather', max_length=10)
    
[/code]

このような場合、外部キーを利用して、以下のような内容に変更するのが得策でしょうか？

[code]

    class PrefNo(models.Model):
        pref_id = models.PositiveIntegerField('pref_id')
        pref_no = models.PositiveIntegerField('pref_no')
    
    
    class BlockNo(models.Model):
        block_id = models.PositiveIntegerField('block_id')
        block_no = models.PositiveIntegerField('block_no')
    
    
    class Wheather(models.Model):
        pref_no = models.ForeignKey(PrefNo, 'pref_no', on_delete=models.PROTECT)
        block_no = models.ForeignKey(BlockNo, 'block_no', on_delete=models.PROTECT)
    
        weather_id = models.PositiveIntegerField('weather_id')
        date = models.DateField('date')
        ave_temp = models.FloatField('ave_temp')
        max_temp = models.FloatField('max_temp')
        min_temp = models.FloatField('min_temp')
        rain = models.PositiveIntegerField('rain')
        sun = models.FloatField('sun')
        weather = models.CharField('weather', max_length=10)
    
[/code]

この考えで正しい場合、都道府県（それぞれの地域含む）の数だけ、テーブルを作る時はどのようにしたらよろしいでしょうか？

テーブルを作成してから、[管理者画面より、CSVデータを利用して、各都道府県（それぞれの地域含む）にデータを保存させる作業を行います](https://blog.daisukekonishi.com/post/django-
import-export-csv/)。

そのため、コードを動かしてテーブルを作るのではなく、makemigratins,migrateを行って、あらかじめテーブルを作成する必要があります。


CC BY-SA 4.0
2020-01-07T03:37:04.787
62019
2021-05-05T00:50:03.500
2021-05-05T00:50:03.500
19110
36988
question
python python3 django
models.pyの中で、複数のクラスの効率的な作り方