Django Rest Framework-一对多关系不起作用

时间:2018-09-21 16:41:58

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


我正在尝试序列化与许多对象相关的对象。这是具有多个日志关系的订单。在这些教程(https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_one/http://www.django-rest-framework.org/api-guide/relations/#nested-relationships)中,我尝试执行相同的操作,但是不起作用。我也看过各种Google链接,但一无所获。有人可以帮助我吗?我在做什么错了?

models.py

<body>
<p id="demo"></p>
<script>
    var fruits, text, year, i;
    fruits = ["Banana", "Orange", "Apple", "Mango"];
    year = ["0", "1", "2", "3"];
    text = "<ul>";
    for (i = 0; i < fruits.length; i++) {
        switch (fruits[i]) {
            case 'Mango':
                text += "<li>" + fruits[i] + "</li>";
                text += "<li><b>" + year[i] + "</b></li>";
                break;
            case 'Pine apple':
                text += "<li>" + fruits[i] + "</li>";
                text += "<li><b>" + year[i] + "</b></li>";
                break;
            case 'Grape':
                text += "<li>" + fruits[i] + "</li>";
                text += "<li><b>" + year[i] + "</b></li>";
                break;
            case 'Banana':
                text += "<li>" + fruits[i] + "</li>";
                text += "<li><b>" + year[i] + "</b></li>";
                break;
        }
    }
    text += "</ul>";
    document.getElementById("demo").innerHTML = text;
</script>

serializers.py

class MaintenanceOrder(models.Model):
    responsible_technician = models.ForeignKey(Technician, on_delete=models.DO_NOTHING, null=True)

    order_code = models.CharField(max_length=12, null=True)
    note_code = models.CharField(max_length=12, null=True)
    equipment = models.CharField(max_length=18, null=True)
    locale = models.CharField(max_length=30, null=True)
    short_description = models.CharField(max_length=40, null=False)
    description = models.TextField(null=True)
    priority = models.CharField(max_length=1, null=False)
    breakdown = models.CharField(max_length=1, null=True)
    stop_time = models.DateTimeField(null=True)
    end_time = models.DateTimeField(null=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    status = models.ForeignKey(MaintenanceStatus, on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.order_code

    class Meta:
        managed = True


class MaintenanceLog(models.Model):
    maintenance_order = models.ForeignKey(MaintenanceOrder, on_delete=models.DO_NOTHING)
    technician = models.ForeignKey(Technician, on_delete=models.DO_NOTHING, blank=True, null=True)

    start_time = models.DateTimeField()
    stop_time = models.DateTimeField(null=True)

    description = models.TextField(null=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.description

    class Meta:
        managed = True

此API会返回所有订单,但没有“ order_log” ...即使我在字段中指定“ order_log”,也不会返回...是的,数据库中有相关数据。

其他信息
Python:3.5
Django:2.1

1 个答案:

答案 0 :(得分:2)

order_log不是MaintenanceOrder模型的正确字段。

您需要指定order_log的来源。在这种情况下,它是maintenancenlog_set。

执行以下操作:

class MaintenanceOrderSerializer(serializers.ModelSerializer):
    status_code = serializers.IntegerField(source='status.status_code', read_only=True)
    order_log = MaintenanceLogSerializer(source='maintenancelog_set', many=True, read_only=True)

    class Meta:
        model = MaintenanceOrder
        fields = ( 'order_log', )

您需要在字段中明确指定它。包括所有其他MaintenanceOrder属性。