如何连接Serializer(DjangoRestFramework)中的字段?

时间:2017-01-19 10:56:26

标签: python django rest django-rest-framework

我对SQL-legacy DB具有读访问权限。假设在DB中我有两个表: Treatment和TreatmentType 。 在治疗表中,我有patientID (int), date (text), treatmentType (int)。在TreatmentType表中,我有code(int) and meaning (Text) Treatment.treatmentType 是用于在TreatmentType表中查找含义的代码。

在第一次迁移期间,我使用内置方法:来自inspectdb的{​​{1}},我得到这样的内容:

django

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

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'

工作正常。但我对此有点怀疑。有没有其他替代方法可以正确地进行(以更有效的方式)?

谢谢!

1 个答案:

答案 0 :(得分:1)

如前几条评论中所述,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。