#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.