Как в django создать класс модели динамически

  1. При динамическом создании и генерации класса Model, изменении некоторых свойства, заполняем информацию, требуемую подтаблицей, в первый раз может вернуть нормальный результат, второй результат ошибка, после анализа второго поля результата, чтобы сохранить первый имя таблицы:
class Object:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
 
 
def _model_new(cls, *args, **kwargs):
    return cls(*args, **kwargs)enter code here

class ShardModel(object):
   
    _shard_db_models = {}
    temp_class = []
    def __new__(cls, *args, **kwargs):
        shard_key = kwargs.pop('shard_key', 0) % cls.Config.table_num
        model_name = cls.__name__
        model_name += '_%s' % shard_key 
        model_class = cls._shard_db_models.get(model_name)        
        if model_class is not None:        
            return model_class        
        # Deep copy attrs
        attrs = dict()    
        attrs.update(cls.__dict__)
        if 'objects' in attrs:             
            attrs['objects'] = attrs['objects'].__class__()
 
        # Set table name with shard_key        
        meta = Object(**cls.Meta.__dict__)
        meta.db_table = meta.db_table % shard_key
        meta.abstract = False
        attrs['Meta'] = meta
        attrs['new'] = classmethod(_model_new)  
        attrs['__module__'] = cls.__name__
        cursor = connection.cursor()
        tables = [table_info.name for table_info in connection.introspection.get_table_list(cursor)]
        # Create model class dynamically
        
        model_class = type(model_name, tuple([models.Model] + list(cls.__bases__[1:])), attrs)
        print(model_class)
        if meta.db_table  not in tables:
            for cmd in ('makemigrations', 'migrate'):
                    exec_command(cmd, meta.app_label)
        cls._shard_db_models[model_name] = model_class
        return model_class

это моя модель

    class Nice(ShardModel):
        user_id = models.IntegerField()
        user_name = models.CharField(max_length=256)
        password = models.CharField(max_length=256)
     
        class Config:
            table_num = 3
            
        class Meta:
            app_label = 'Test'
            db_table = 'test_%s'
            abstract = True

это мое мнение

    def NiceView(request):
        user_id = int(request.GET.get('user_id')) 
        user = Nice(shard_key=user_id).objects.get(user_id=user_id)  
    
        return HttpResponse(json.dumps(model_to_dict(user)))

Вот результаты двухкратного тестирования url:http://127.0.0.1:8000/test?user_id=7 результаты:{"id": 2, "user_id": 7, "user_name": "ni", "password": "hao"};url:http://127.0.0.1:8000/test?user_id=5;error:(1054, "Unknown column 'test_1.user_id' in 'field list'")

Вернуться на верх