在 Django Serializer 中获取反向关系
Get reverse relation in Django Serializer
型号:
class MaterialRequest(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='owner')
linked = models.CharField(max_length=50, default="-", blank=True, null=True)
flows = models.ManyToManyField(MaterialRequestFlow)
is_allocated = models.BooleanField(default=False)
delivery_required_on = models.DateTimeField(default=datetime.now)
raised_by = models.CharField(max_length=1000, default="__________", blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
class Allotment(models.Model):
transaction_no = models.IntegerField(default=0)
sales_order = models.ForeignKey(MaterialRequest, on_delete=models.CASCADE)
is_delivered = models.BooleanField(default=False)
document_available = models.BooleanField(default=False)
现在显示我的 Material 请求 table 我正在做这样的事情:
class MREmpTableAPIView(APIView):
permission_classes = (permissions.IsAuthenticated, MRViewPermission)
def get(self, request, *args, **kwargs):
items = MaterialRequest.objects.all().order_by('-id')
serializer = EMaterialRequestTableListSerializer(items, many=True)
return Response(serializer.data, status=status.HTTP_201_CREATED)
序列化器:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
class Meta:
model = MaterialRequest
exclude = ('flows',)
我在其中获得了 Material 请求的所有详细信息,但我还想在 Material 请求 Table 中显示 linked
分配的 transaction_no
.我该怎么做?
编辑:
单个 Material 请求与单个分配(transaction_no)相关联,我想在同一个 table
上显示 Transaction no
我得到的输出:
created_at: "2021-09-22T10:28:44.248034Z"
delivery_required_on: "2021-09-22T09:08:43.968000Z"
id: 739
is_allocated: false
linked: "729-3"
owner: "Lumax Mannoh Allied Technologies Limited"
期望的输出:
created_at: "2021-09-22T10:28:44.248034Z"
delivery_required_on: "2021-09-22T09:08:43.968000Z"
id: 739
is_allocated: false
linked: "729-3"
owner: "Lumax Mannoh Allied Technologies Limited"
transaction_no: foo
解决这个问题的一个直接方法是使用这样的 SerializerMethodField
:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
transaction_no = serializers.SerializerMethodField()
class Meta:
model = MaterialRequest
exclude = ('flows',)
def get_transaction_no(self, obj)
allotment = obj.allotment_set.first()
return allotment.transaction_no if allotment else None
但是这将尝试访问每个 MaterialRequest
实例的数据库以获得相关分配。
为了提高效率,您可以像这样预取每个 material 请求的相关分配:
items = MaterialRequest.objects.all().order_by('-id').prefetch_related('allotment_set')
然后在你的序列化程序中做这样的事情:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
transaction_no = serializers.SerializerMethodField()
class Meta:
model = MaterialRequest
exclude = ('flows',)
def get_transaction_no(self, obj)
if obj.allotment_set.all():
return obj.allotment_set.all()[0].transaction_no
return None
型号:
class MaterialRequest(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='owner')
linked = models.CharField(max_length=50, default="-", blank=True, null=True)
flows = models.ManyToManyField(MaterialRequestFlow)
is_allocated = models.BooleanField(default=False)
delivery_required_on = models.DateTimeField(default=datetime.now)
raised_by = models.CharField(max_length=1000, default="__________", blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
class Allotment(models.Model):
transaction_no = models.IntegerField(default=0)
sales_order = models.ForeignKey(MaterialRequest, on_delete=models.CASCADE)
is_delivered = models.BooleanField(default=False)
document_available = models.BooleanField(default=False)
现在显示我的 Material 请求 table 我正在做这样的事情:
class MREmpTableAPIView(APIView):
permission_classes = (permissions.IsAuthenticated, MRViewPermission)
def get(self, request, *args, **kwargs):
items = MaterialRequest.objects.all().order_by('-id')
serializer = EMaterialRequestTableListSerializer(items, many=True)
return Response(serializer.data, status=status.HTTP_201_CREATED)
序列化器:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
class Meta:
model = MaterialRequest
exclude = ('flows',)
我在其中获得了 Material 请求的所有详细信息,但我还想在 Material 请求 Table 中显示 linked
分配的 transaction_no
.我该怎么做?
编辑:
单个 Material 请求与单个分配(transaction_no)相关联,我想在同一个 table
上显示Transaction no
我得到的输出:
created_at: "2021-09-22T10:28:44.248034Z"
delivery_required_on: "2021-09-22T09:08:43.968000Z"
id: 739
is_allocated: false
linked: "729-3"
owner: "Lumax Mannoh Allied Technologies Limited"
期望的输出:
created_at: "2021-09-22T10:28:44.248034Z"
delivery_required_on: "2021-09-22T09:08:43.968000Z"
id: 739
is_allocated: false
linked: "729-3"
owner: "Lumax Mannoh Allied Technologies Limited"
transaction_no: foo
解决这个问题的一个直接方法是使用这样的 SerializerMethodField
:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
transaction_no = serializers.SerializerMethodField()
class Meta:
model = MaterialRequest
exclude = ('flows',)
def get_transaction_no(self, obj)
allotment = obj.allotment_set.first()
return allotment.transaction_no if allotment else None
但是这将尝试访问每个 MaterialRequest
实例的数据库以获得相关分配。
为了提高效率,您可以像这样预取每个 material 请求的相关分配:
items = MaterialRequest.objects.all().order_by('-id').prefetch_related('allotment_set')
然后在你的序列化程序中做这样的事情:
class EMaterialRequestTableListSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(read_only=True, slug_field='full_name')
transaction_no = serializers.SerializerMethodField()
class Meta:
model = MaterialRequest
exclude = ('flows',)
def get_transaction_no(self, obj)
if obj.allotment_set.all():
return obj.allotment_set.all()[0].transaction_no
return None