Django Resf Framework:POST 时自动填充模型的字段?

时间:2021-06-07 17:58:54

标签: django django-rest-framework relational-database autofill

有没有办法使用另一个模型对象的字段值填充模型中的某些特定字段?

比如我想到了以下场景:
1 - 有一些型号

from django.db import models

class Supplier(models.Model):
    supplier = models.Charfield(max_length=50, unique=True)

class Object(models.Model):
    object = models.Charfield(max_length=50)
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, to_field="supplier")

class Transaction(models.Model):
    object_id = models.ForeignKey(Object, on_delete=models.CASCADE)
    supplier = models.Charfield(max_length=50)

2 - 这些模型被序列化

from . import models
from rest_framework.serializers import ModelSerializer

class SupplierSerializer(ModelSerializer):
    class Meta:
        model = models.Supplier
        fields = '__all__'

class ObjectSerializer(ModelSerializer):
    class Meta:
        model = models.Object
        fields = '__all__'

class TransactionSerializer(ModelSerializer):
    class Meta:
        model = models.Transaction
        exclude = ('supplier',)

3 - 有一个视图

from . import models, serializers
from rest_framework.viewsets import ModelViewSet

class TransactionApiViewset(ModelViewSet):
    queryset = models.Transaction.objects.all()
    serializer_class = serializers.TransactionSerializer

当向 Transaction Api 提交带有 'object_id' 字段的帖子时,我希望 Transaction Model 中的 'supplier' 字段自动填充为与 'object_id' 相关的 Object 对象的 'supplier' 字段值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您可以对 supplier 使用属性(或 cached_property)方法,而不是保存为字段:

class Transaction(models.Model):
    object = models.ForeignKey(Object, on_delete=models.CASCADE)

    @property
    def supplier(self):
        return self.object.supplier.supplier

如果您需要将 supplier 保存在 Transaction 表中,那么只需保留您发布的模型定义,并在序列化程序中添加一个 validate 方法:

class TransactionSerializer(ModelSerializer):
    def validate(self, data):
        object = Object.objects.get(id=data["object_id"])
        data["supplier"] = object.supplier.supplier
        return data

这将使用新对象相关供应商的 Transaction 字段自动更新 supplier

相关问题