Простейший способ нормализации данных в моделях Родительские дочерние таблицы Django Models

Пытаюсь найти самый простой способ сделать мета абстрактную дочернюю модель и мета абстрактную родительскую модель с одинаковыми столбцами "data" уникальными, Дочерние модели, которые я создаю, будут наследовать мета абстрактную дочернюю модель, будут иметь имена столбцов в ссылках на имена родительских моделей. Что-то, что может get_or_create в родительской модели, сохраняясь в дочерней модели


from django.db import models
from django.apps import apps

class ParentCharField(models.CharField):
    description = "A unique not null charfield for normalized parent tables"

    def __init__(self, *args, **kwargs):
        kwargs['unique'] = True
        kwargs['null'] = False
        super().__init__(*args, **kwargs)


class ParentModel(models.Model):
    data = ParentCharField(max_length=10)

    class Meta:
        abstract = True
        

class ChildModel(models.Model):
    
    def getModels(self):
        return apps.get_models()
    
    def get_model_name(self, value):
        model_name = value.capitalize()
        models = apps.get_models()
        for i in models:
            p = i.__name__.split('.')[-1]
            if model_name in p:
                return i
    
    def get_parent_object(self, name, value):
        object_cls = self.get_model_name(name)
        if object_cls:
            objected, created = object_cls.objects.get_or_create(data=value)
            return object_cls.objects.get(id = objected.id)

    def save(self, *args, **kwargs):
        fields = [i.name for i in self._meta.fields][1:]
        newargs = []
        newkwargs = {}
        if args:
            p=0
            for i in args:
                  newargs.append(self.get_parent_object(fields[p],i))
                  p += 1
        if kwargs:
            for i, v in kwargs.items():
                newkwargs[i] = self.get_parent_object(i, v)

        models.Model.save(self, *newargs, **newkwargs)    
         
    class Meta:
        abstract = True

class Cik(ParentModel):
    pass

class Name(ParentModel):
    pass

class Test(models.Model):
    cik = models.ForeignKey(Cik, on_delete=models.CASCADE)
    name = models.ForeignKey(Name, on_delete=models.CASCADE)
    

Я попробовал вышеописанное, с правками, конечно, ошибки проявлялись от неожиданного аргумента ключевого слова cik до цикла, который просто продолжал загружать базу данных, останавливаясь только по прерыванию клавиатуры.

Это, Ниже/, прекрасно работало в shell

b = Test(cik=Cik.objects.get_or_create(data='another')[0], name=Name.objects.get_or_create(data='rasta')[0] )
b.save()

Нужно ли мне переопределить __init__ и манипулировать kwargs или args? Просто пытаюсь упростить процесс вставки данных и их нормализации в дочерней таблице. ищу решение, а не дебаты по нормализации Спасибо

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