Django 通过外键或其他字段引用模型

Posted

技术标签:

【中文标题】Django 通过外键或其他字段引用模型【英文标题】:Django reference a Model by foreign key or a different field 【发布时间】:2016-06-18 15:53:00 【问题描述】:

我正在使用 Django REST 框架。我有两个模型,站点和状态。

class Sites(models.Model):
    site_id = models.AutoField(primary_key=True)
    status = models.ForeignKey(Statuses, models.DO_NOTHING, blank=True, null=True)
class Statuses(models.Model):
    status_id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=255, blank=True, null=True, unique=True)

    class Meta:
        managed = True
        db_table = 'Statuses'

我希望能够在网站上执行 GET,并返回 Statuses.description 字段(而不是 Statuses.status_id)。另外,我希望它可以在 POST 中互换使用 status_id 或 description 来创建新站点。这种类型的功能属于哪里(序列化程序、模型等)?

我知道我可以通过向 Sites 模型添加一个属性然后在 Sites 序列化程序中引用该字段来完成我的问题的第一部分。

@property
def status(self):
    return self.row_status.description

但是我认为模型的约定是它应该是数据库表的 1:1 表示。有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

这很适合序列化程序,如下所示:

class SitesSerializer(serializers.ModelSerializer):
    description = serializers.CharField(source='status.description')

    class Meta:
        model = Sites
        fields = ('site_id', 'description')

(但status 字段可能不应该设置null=True。)

【讨论】:

这回答了我问题的第一部分,并且比在模型中使用 @property 要好得多。但是,它并没有解决问题的第二部分:有没有办法通过整数(id)或字符串(描述)发布新站点和引用状态?

以上是关于Django 通过外键或其他字段引用模型的主要内容,如果未能解决你的问题,请参考以下文章

如何通过引用外键将 Django 模型移动到其他应用程序?

django模型引用其他类的对象

通过django模板中的外键关系快速访问模型属性

在搜索字段中正确使用外键引用,Django admin

django模型,如何动态设置查询的字段?

Django外键:获取相关模型?