Простейший способ нормализации данных в моделях Родительские дочерние таблицы 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
?
Просто пытаюсь упростить процесс вставки данных и их нормализации в дочерней таблице. ищу решение, а не дебаты по нормализации Спасибо