Лучший способ добавить поле bool в Django queryset/serializer

У меня есть две модели

class A(models.Model):
    name = models.CharField(max_length=32)
    ...

class B(models.Model):
    fkey = models.ForeignKey("A", on_delete=models.CASCADE)
    ...

Я хочу создать набор объектов A на основе условия, если некоторые объекты B ссылаются на A в моем DRF сериализаторе

a1 = A.objects.create(name="1")
a2 = A.objects.create(name="2")
b1 = B.objects.create(fkey=a1)
a_objs = A.objects.filter()
serializer = ASerializer(a_objs, many=True)
serializer.data
{
  {
    "name": "1"
  },
  "b_attached": true
},
{
  {
    "name": "2"
  },
  "b_attached": false
}

Каким способом лучше всего этого достичь?

Ваш ответ - недопустимый json!

Вы можете использовать вложенную сериализацию для достижения чего-то подобного:

from rest_framework import serializers

from .models import A, B


class ADetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = A
        fields = ("name",)


class ASerializer(serializers.ModelSerializer):
    A_OBJ = serializers.SerializerMethodField(method_name='get_a_obj')

    b_attached = serializers.SerializerMethodField(method_name='get_b_attached')

    class Meta:
        model = A
        fields = ("A_OBJ", "b_attached")

    def get_b_attached(self, obj):
        if obj.b_set.exists():
            return True
        return False

    def get_a_obj(self, obj):
        return ADetailSerializer(obj, many=False).data

и ответ будет следующим:

[
    {
        "A_OBJ": {
            "name": "1"
        },
        "b_attached": true
    },
    {
        "A_OBJ": {
            "name": "2"
        },
        "b_attached": false
    }
]
Вернуться на верх