【问题标题】:Django reference a Model by foreign key or a different fieldDjango 通过外键或其他字段引用模型
【发布时间】: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 表示。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python django model django-rest-framework serialization


    【解决方案1】:

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

    class SitesSerializer(serializers.ModelSerializer):
        description = serializers.CharField(source='status.description')
    
        class Meta:
            model = Sites
            fields = ('site_id', 'description')
    

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

    【讨论】:

    • 这回答了我问题的第一部分,并且比在模型中使用 @property 要好得多。但是,它并没有解决问题的第二部分:有没有办法通过整数(id)或字符串(描述)发布新站点和引用状态?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2018-01-10
    • 1970-01-01
    • 2013-09-29
    • 2016-03-13
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多