Множество отношений "один к одному", указывающих на одну и ту же модель Django
Я разрабатываю приложение на Django, где у меня есть модель Item с многочисленными атрибутами для каждого элемента. У меня очень низкая производительность в приложении, и я думаю, есть ли недостатки в моей настройке, которые могут быть причиной этой проблемы. Я относительно новичок в Django, поэтому любые советы будут очень признательны.
В настоящее время у меня есть около 200 моделей атрибутов, каждая из которых имеет необязательные поля один к одному, связанные с элементом через внешний ключ следующим образом:
Модели атрибутов:
class AttrBase(models.Model):
prev_value = models.CharField(max_length=250, null=True, blank=True)
edited_by = models.ForeignKey(
Account, on_delete=models.CASCADE, null=True, blank=True
)
edited_on = models.DateTimeField(null=True, blank=True)
options = None
class Meta:
abstract = True
class ID(AttrBase):
item = models.OneToOneField(Item, on_delete=models.CASCADE)
value = models.CharField(max_length=250, null=True, blank=True)
name = "ID"
tooltip = "..."
group = "..."
class Height(AttrBase):
item = models.OneToOneField(Item, on_delete=models.CASCADE)
value = models.IntegerField(null=True, blank=True)
name = "Height"
tooltip = "..."
group = "..."
...more
Я также использую общие отношения для связи со всеми группами, как показано ниже:
class AttributeGroup(models.Model):
content_type = models.ForeignKey(
ContentType,
on_delete=models.CASCADE,
limit_choices_to={"app_label": "attributes"},
)
name = models.CharField(max_length=250, null=True, blank=True)
description = models.CharField(
max_length=1000, default="TODO", null=True, blank=True
)
def __str__(self):
return str(self.content_type)
def save(self, *args, **kwargs):
self.name = self.content_type.name
super(AttributeGroup, self).save(*args, **kwargs)
Это моя модель Item model:
class Item(models.Model):
"""
An item with related attributes.
"""
program = models.ForeignKey(Program, on_delete=models.CASCADE)
# part_number = models.CharField(max_length=25, db_index=True, unique=True)
item_number = models.CharField(max_length=50, db_index=True)
valid = models.BooleanField(default=True)
leaf = models.BooleanField(default=False)
def __str__(self):
return f"{self.program.program_code}-{self.part_number}"
def get(self):
"""
Return the item and all of its attributes.
"""
# TODO: tune this?
attributes_dict = {}
attribute_groups = self.program.attribute_groups.all()
attr_model_names = ["Name", "Type", "Identifier", "Level"]
# Iterate over each attribute type
for model_name in attr_model_names:
model = apps.get_model("attributes", model_name)
attr_instances = model.objects.filter(
part=self, part__program__attribute_groups__in=attribute_groups
)
for attr_instance in attr_instances:
attributes_dict[f"{model_name}"] = attr_instance.value
return attributes_dict
@classmethod
def load(cls, program, part_number, attribute_vals=None):
...
Загрузка, создание и чтение данных о деталях происходит крайне медленно. Я пробовал напрямую индексировать все атрибуты, поскольку (насколько я понимаю) это должно выполняться за O(1)
время, но CRUD-операции над данными детали по-прежнему выполняются крайне медленно.