Как я могу создавать поля в модели в зависимости от другой модели?

Я изучаю Django и работаю в тестовом проекте.

Итак, в моем models.py у меня есть следующее (я знаю, что это неправильно, но я не знаю, как это сделать):

from django.db import models

class Diagram(models.Model):
    name = models.CharField(max_length=100)
    img = models.ImageField(upload_to='img/diagrams/', help_text="Size required: height = 1050px, width = 1506px.", max_length=None)    
    
    def __str__(self):
        return self.name

class DiagramReferences(Diagram):
    quantity_of_references = models.IntegerField()

    for i in range(quantity_of_references):
        title = models.CharField(max_length=50)
        coords = models.CharField(max_length=50)

Итак, я хочу установить связь между обеими моделями, первая: Diagram содержит имя диаграммы и соответствующее изображение. В другой я хочу выбрать первую, которая уже создана, и присвоить ей, сколько ссылок она имеет, и создать поле для каждой ссылки.

Сначала вы собираетесь создать Diagram. вы должны создать функцию для вашего каталога загрузки:

def user_directory_path_img(instance, filename):
    # file will be uploaded to MEDIA_ROOT / user_<id>/<filename> if you've declared MEDIA path
    return 'img/diagrams/{0}/{1}-{2}'.format(instance.name, datetime.now(tz=pytz.UTC).date(), filename)

class Diagram(models.Model):
    name = models.CharField(max_length=100)
    img = models.ImageField((upload_to=user_directory_path_img, null=True, blank=True)   
    
    def __str__(self):
        return self.name

Затем вы собираетесь создать поле ForeignKey. Как сказал vinkomlacic, вы не можете создавать динамические отношения, и рекомендуется не связываться с этим. Если вы хотите иметь различные поля, либо создайте TextField с несколькими записями или массивами, либо просто создайте максимальное количество полей, которые вы считаете необходимыми, и установите их в blank=True, null=True.

class DiagramReferences(models.Model):
   diagram = models.ForeignKey(Diagram, on_delete=models.CASCADE, blank=True, null=True, default=None)
   title = models.CharField(max_length=50, blank=True, null=True)
   coords = models.CharField(max_length=50, blank=True, null=True)
   extra = models.CharField(max_length=50, blank=True, null=True)
Вернуться на верх