从一个应用程序获取字段名称到 django 中的另一个应用程序

Posted

技术标签:

【中文标题】从一个应用程序获取字段名称到 django 中的另一个应用程序【英文标题】:get field name from one app to another app in django 【发布时间】:2021-03-28 15:36:06 【问题描述】:

我们定义了两个应用程序:Manin_matrixSW_matrix

我们希望 Main_matrix 应用内 models.py 的类 GENERAL_t 中的字段名称 (project_name) 出现在 SW_matrix appmodels.py 文件中。

基本上,EDVTSW_matrix models.py 类中的 project_name_work 字段应与 Main_matrix 应用程序的 project_name 相同。 我们希望这样做,以便在 EDVT 表的数据库中,我们将获得相同的项目 ID 以及项目名称。

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 字段只是另一个表中一行的 ID,没有比这更复杂的了。

当使用像这样的ForeignKey 链接时,最好使用字符串,这样您就不必导入相关模型。字符串的格式为'<appname.ModelName>

例如,我将一个对象链接到这样的 (django) 内容类型;

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

因此,将您的 EDVT 模型链接到 GENERAL_t 您会这样做;

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

如果EDVT 需要能够返回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(或该模型上的任何其他字段)

【讨论】:

所以这里的 project_rel 在我们的例子中是 general_t,我们尝试使用 @property。但它显示了自我错误。而且它在数据库中也不起作用。无法保存字符串。刚刚显示id @DivyankGarg 有什么错误?而 ID 就是 ForeignKey 字段的全部内容。

以上是关于从一个应用程序获取字段名称到 django 中的另一个应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型字段默认基于同一模型中的另一个字段

从 Qt C++ 中的另一个应用程序获取文本字段的值

如何在 django 模板中的另一个字段中更改后禁用复选框?

将数据库列复制到Django中的另一个

确保字段对于 Django 模型中的另一个字段是唯一的

django - 从不同的模型字段名称中获取一组对象