Django Rest Framework:在 POST 时自动填充模型的字段?
Django Resf Framework: auto fill a field of a Model when POST?
有没有办法使用另一个模型对象的字段值来填充模型中的某些特定字段?
例如,我想到了以下场景:
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
在向事务 Api 提交带有 'object_id' 字段的 post 时,我希望事务模型中的 'supplier' 字段自动填充 'supplier' 与'object_id'.
相关的Object对象的字段值
如有任何帮助,我将不胜感激。
我认为您可以对 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
table 中,那么只需保留您发布的模型定义,并在序列化程序中添加一个 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
字段。
有没有办法使用另一个模型对象的字段值来填充模型中的某些特定字段?
例如,我想到了以下场景:
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
在向事务 Api 提交带有 'object_id' 字段的 post 时,我希望事务模型中的 'supplier' 字段自动填充 'supplier' 与'object_id'.
相关的Object对象的字段值如有任何帮助,我将不胜感激。
我认为您可以对 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
table 中,那么只需保留您发布的模型定义,并在序列化程序中添加一个 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
字段。