【问题标题】:Django REST framework: Join tablesDjango REST 框架:连接表
【发布时间】:2022-01-21 02:22:06
【问题描述】:

我正在尝试创建一个 API 视图,用户在其中输入控制器的名称并接收它可以作为 JSON 返回的测量值。

models.py

class Microcontrollers(models.Model):
    name = models.CharField(max_length=25)
    serial_number = models.CharField(max_length=20, blank=True, null=True)
    type = models.CharField(max_length=15, blank=True, null=True)
    software = models.CharField(max_length=20, blank=True, null=True)
    version = models.CharField(max_length=5, blank=True, null=True)
    date_installed = models.DateField(blank=True, null=True)
    date_battery_last_replaced = models.DateField(blank=True, null=True)
    source = models.CharField(max_length=10, blank=True, null=True)
    friendly_name = models.CharField(max_length=45, blank=True, null=True)

class MicrocontrollersMeasurements(models.Model):
    microcontroller = models.ForeignKey(Microcontrollers, models.DO_NOTHING, blank=True, null=True)
    measurement = models.ForeignKey(Measurements, models.DO_NOTHING, blank=True, null=True)

class Measurements(models.Model):
    code = models.CharField(max_length=25)
    measurement = models.CharField(max_length=25)
    unit = models.CharField(max_length=25)
    type = models.CharField(max_length=25)

序列化器.py

class SourceStationsSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

    class Meta:
        model = Microcontrollers
        fields = ['id', 'name']

class StationMeasurementsSerializer(serializers.ModelSerializer):
    
    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

    class Meta:
        model = MicrocontrollersMeasurements
        fields = '__all__'

class MeasurementsSerializer(serializers.ModelSerializer):
    station = SourceStationsSerializer()
    stationMeasurements = StationMeasurementsSerializer()

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

    class Meta:
        model = Measurements
        fields = '__all__'

数据库为每个控制器和测量创建 ID。我的问题是如何加入这 3 个表,以便找到属于每个控制器的测量值。

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    你实际上并不需要 django 中的中间模型..

    class Measurements(models.Model):
        microcontroller = models.ForeignKey(Microcontrollers,related_name="measurements",on_delete=models.DO_NOTHING, blank=True, null=True)
        code = models.CharField(max_length=25)
        measurement = models.CharField(max_length=25)
        unit = models.CharField(max_length=25)
        type = models.CharField(max_length=25)
    

    注意related_name='measurements" 现在说,

    pic = Microcontrollers.objects.get(id=1) #or any instance of MMicrocontrollers()
    measurements_pic = pic.measurements.all() # will get a list of all measurements associated with pic
    

    pic.measurements.all() 中的这个“测量值”是相关名称。 Django 创建了中间表和所有这些东西......并对其进行了简化。

    用于输出目的

    out = MeasurementsSerializer(measurements_pic,many=True)

    将完成这项工作。 注意:'type'是python中的关键字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 2014-06-12
      • 2016-07-20
      • 1970-01-01
      • 2019-05-24
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多