получение имени поля из одного приложения в другое приложение в django

#django #postgresql #django-models #django-rest-framework #django-templates

#django #postgresql #django-модели #django-rest-framework #django-шаблоны

Вопрос:

Мы определили два приложения: Manin_matrix и SW_matrix .

Мы хотим, чтобы имя поля ( project_name ), присутствующее в классе GENERAL_t models.py файла внутри Main_matrix приложения, находилось внутри models.py файла SW_matrix app .

В принципе, project_name_work поле в классе EDVT SW_matrix models.py должно быть таким же, как project_name Main_matrix в приложении. Мы хотим, чтобы в базе данных для EDVT таблицы мы получали тот же идентификатор проекта вместе с именем проекта.

Main_matrix/models.py

     class GENERAL_t(models.Model):
        project_name = models.CharField(
            blank=True,
            null=True,
            max_length=40,
            verbose_name='Project_Name'
        )
        platform = models.CharField(
            blank=True,
            null=True,
            max_length=40,
            verbose_name='Platform SW'
        )
 

SW_matrix/models.py

     class EDVT(models.Model):
        project_rel=models.ForeignKey(
            GENERAL_t,
            null=True,
            on_delete=models.SET_NULL,
            verbose_name="Choose Project"
        )
        project_name_work = models.ForeignKey(
            GENERAL_t.project_name,
            null=True,
            verbose_name='Project_Name'
        )
 

Ответ №1:

Вам не нужно этого делать, и FK этого не позволит. Поле FK — это просто идентификатор строки в другой таблице, ничего более сложного, чем на самом деле.

При работе с ForeignKey подобными ссылками рекомендуется использовать строки, чтобы вам не приходилось импортировать связанную модель. Формат строки '<appname.ModelName>

Например, я связываю объект с типом содержимого (django) следующим образом;

 source_content_type = models.ForeignKey(
    verbose_name=_('source content type'),
    to='contenttypes.ContentType',
    on_delete=models.CASCADE
)
 

Итак, чтобы связать вашу EDVT модель с a GENERAL_t , вы бы сделали;

     class EDVT(models.Model):
        general_t = models.ForeignKey(
            to='Manin_matrix.GENERAL_t',
            null=True,
            verbose_name='general t'
        )
 

Затем, если EDVT необходимо иметь возможность возвращать a project_name , вы могли бы сделать это как свойство.

     class EDVT(models.Model):
        project_rel = models.ForeignKey(
            to='Manin_matrix.GENERAL_t',
            null=True,
            verbose_name='Project_Name'
        )

        @property
        def project_name(self):
            return self.project_rel.project_name
 

Затем вы можете получить к нему доступ либо с помощью EDVT.objects.first().project_name , либо если вы не реализовали property , что вы можете сделать EDVT.objects.first().general_t.project_name (или любое другое поле в этой модели)

Комментарии:

1. итак, здесь project_rel в нашем случае является general_t, и мы попробовали с @property . Но он показал ошибку в self. И это не сработало также в базе данных. Не удалось сохранить строку. Просто показал идентификатор

2. @DivyankGarg В чем ошибка? И ИДЕНТИФИКАТОР — это все, что вы получите для поля ForeignKey.