Множество отношений "один к одному", указывающих на одну и ту же модель 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-операции над данными детали по-прежнему выполняются крайне медленно.

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