python - 如何连接序列化器(DjangoRestFramework)中的字段?

标签 python django rest django-rest-framework

我拥有对 SQL 旧版数据库的读取访问权限。假设在数据库中我有两个表:Treatment 和 TreatmentType。 在治疗表中,我有病人ID (int)、日期(文本)、治疗类型(int)。在TreatmentType 表中,我有code(int) 和meaning (Text)Treatment.treatmentType 是用于在TreatmentType 表中查找含义的代码。

在第一次迁移期间,我使用了一个内置方法:django 中的inspectdb,我得到了这样的结果:

class TreatmentType(models.Model):
    index = models.TextField(primary_key=True)
    code = models.IntegerField(db_column='Code', blank=True, null=True)  # Field name made lowercase.
    meaning = models.TextField(db_column='Meaning', blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'TreatmentType'


class Treatment(models.Model):
    index = models.TextField(primary_key=True)
    patient = models.IntegerField(db_column='PATIENT', blank=True, null=True)  # Field name made lowercase.
    date = models.TextField(db_column='DATE', blank=True, null=True)  # Field name made lowercase. This field type is a guess.
    treatmenttype = models.IntegerField(db_column='TREATTYPE', blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Treatment'

从模型中,我想要一个 REST API,用于通过额外的列 TreatmentMeaning 获取治疗列表。我使用 DjangoRestFramework 为我创建序列化器:

class TreatmentModelSerializer(serializers.ModelSerializer):
    meaning = serializers.SerializerMethodField('get_meaning')

    def get_meaning(self, instance):
        meaning = TreatmentType.objects.get(code=instance.treatmenttype).meaning
        return meaning

    class Meta:
        model = Treatment
        fields = [
            'patient',
            'date',
            'meaning',
        ]

效果很好。但我对此有点怀疑。是否有其他替代方法可以正确地完成(以更有效的方式)?

谢谢!!

最佳答案

正如一些评论中所指出的,inspectdb 只是一个猜测。特别是它无法找到Treatment 和TreatmentType 之间的外键,因此您需要自己进行更改。

更新治疗上的treatmenttype字段,如下所示:

treatmenttype = models.ForeignKey('TreatmentType', db_column='TREATTYPE', to_field='code', blank=True, null=True)

现在,除了能够在您自己的代码中自动跟踪该外键 - 例如通过 my_treatment.treatmenttype.meaning - 您还可以使用 SlugRelatedField在序列化器中自动获取含义值:

class TreatmentModelSerializer(serializers.ModelSerializer):
    treatmenttype = serializers.SlugRelatedField(read_only=True, slug_field='meaning'

还有一些其他字段类型需要更新; index 字段可能应该是 AutoFields,而 date 应该是 DateField。

关于python - 如何连接序列化器(DjangoRestFramework)中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41740075/

相关文章:

c# - 曼德尔布罗特算法 - 背景颜色

python - 从 Django 内部调用时,Subprocess.Popen 与交互式程序挂起

java - JAX-RS 服务的集成测试

python - 从(或附近)具有相同名称的脚本导入库会引发 "AttributeError: module has no attribute"或 ImportError 或 NameError

python - 如何让 QScintilla 像 Sublime Text 一样自动缩进?

python - 如何将每个字典值插入列表中相应键之后?

python - Django Form继承问题

python - Django 模型 : How to use mixin class to override django model for function likes save

python - Django REST Framework 授权 token

java - Spring REST 调用响应类型对象有微小差异