【问题标题】:Django Resf Framework: auto fill a field of a Model when POST?Django Rest Framework:POST时自动填充模型的字段?
【发布时间】:2021-06-07 17:58:54
【问题描述】:

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

例如,我想到了以下场景:
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”字段的帖子时,我希望事务模型中的“supplier”字段自动填充与“object_id”相关的对象对象的“supplier”字段值。

我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 这个属性方法可以用来填充一些字段吗?因为我需要事务表中的那个字段。
    • @marcosnolasco 当然,答案已根据您的评论更新。
    • 非常感谢,这解决了我的问题!如果我有足够的“声誉”,我会支持你的回答^^
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2021-09-15
    相关资源
    最近更新 更多