我知道django有select_related和prefetch_related,可以在从数据库查询项目时使用它来提高性能,并且它可以与django rest framework的嵌套序列化程序配对使用。
但是,当我想使用序列化程序创建我的模型时,问题就出现了 例如:
class CompanySerializer(serializer.serializers):
employee_set = serializers.JSONField()
class Meta:
model = Company
fields = ('id', 'employee_set')
def create(self, validated_data):
employee_set = validated_data.pop('employee_set')
for employee in employee_set:
serializer = EmployeeSerializer(data=employee)
serializer.is_valid(raise_exception=True)
serializer.save()
class EmployeeSerializer(serializer.serializers):
card = serializers.PrimaryKeyRelatedField(queryset=Card.objects.all())
class Meta:
model = Employee
fields = ('id', 'name', 'card')
def validate(self, obj):
if card.employee_set.all().count() > 3:
raise serializers.ValidationError({'_error': 'invalid})
return data
例如,我想创建一个拥有多个员工的公司,如:
request.POST:
{
employee_set: [
{ name: 'tim', card: 1 },
{ name: 'bob', card: 1 },
{ name: 'jimmy', card: 2},
]
}
然后我可以使用CompanySerializer(request.POST),对吗?
但是,当我保存此序列化程序时,EmployeeSerializer将遍历每个员工并查询employee.card_set,这会导致大量的SQL查询。有没有办法像prefetch_related那样做?
感谢
答案 0 :(得分:0)
由于问题太开放,我会给出指示。
Django ORM允许您使用bulk_create一次创建多个实例。
另请注意,您不应该从序列化程序的创建/更新中调用另一个序列化程序,如the documentation
所示答案 1 :(得分:0)
您可以通过context
# use select_related or prefetech_related to get this value
card_counters = {'card_id1': 1, 'card_id2': 3, ...}
for employee in employee_set:
serializer = EmployeeSerializer(
data=employee,
context={'card_counter': card_counters.get(employee['card_id'], 0)}
)
...
然后在进行验证时使用它:
def validate(self, obj):
if self.context['card_counter'] > 3:
raise serializers.ValidationError({'_error': 'invalid})
return data