Search code examples
pythondjangodjango-modelsdjango-rest-frameworkdjango-serializer

Django Serializer - non django model fileds include


i want to list my all employee details. i am using Django serializer.

my models

class RFID(models.Model):
    RFID = models.AutoField(primary_key=True, db_column='RFID')
    Employee = models.ForeignKey(Employee, on_delete=models.CASCADE, db_column='EmployeeId')
    RFIDCode = models.BigIntegerField(unique=True, default=None, null=False, blank=False)

    class Meta:
        db_table = "RFID"


class Employee(models.Model):
    EmployeeId = models.AutoField(primary_key=True, db_column='EmployeeId')
    EmployeeCode = models.CharField(max_length=50, unique=True, null=False, blank=False)
    EmployeeName = models.CharField(max_length=50)
    EmployeeStatus = models.SmallIntegerField(default=1, null=True, blank=True)
    Security = models.SmallIntegerField(default=0, null=True, blank=True)
    Device = models.ManyToManyField(Device, through='EmployeeDevice')

    class Meta:
        db_table = "Employee"

my serilalizer

class RFIDSyncSerializer(serializers.ModelSerializer):
    class Meta:
        model = RFID
        fields = ['RFID', 'RFIDCode']


class EmployeeSerializer(serializers.ModelSerializer):
    rfid_set = RFIDSyncSerializer(read_only=True, many=True)

    class Meta:
        model = Employee
        fields = ['EmployeeId', 'EmployeeName', 'EmployeeCode', 'EmployeeStatus', 'Security', 'rfid_set']

my views.py

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def employee_list(request):
    try:
        employee = employee = Employee.objects.filter(~Q(EmployeeStatus=2))
        serializer = EmployeeSerializer(employee, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
    except Exception as ex:
        return Response({msg: repr(ex)}, status=status.HTTP_400_BAD_REQUEST)

currently my result

[
    {
        "EmployeeId": 21,
        "EmployeeName": "ss",
        "EmployeeCode": "10",
        "EmployeeStatus": 1,
        "Security": 0,
        "rfid_set": []
    },

    {
        "EmployeeId": 1,
        "EmployeeName": "namechagnge",
        "EmployeeCode": "Emp-01",
        "EmployeeStatus": 1,
        "Security": 0,
        "rfid_set": [
            {
                "RFID": 74,
                "RFIDCode": 408
            }
        ]
    }
]

i want to include an extra data to this.. i want to add an extra field Rfid = true , if RFID present and Rfid= false if Rfid not present

[
    {
        "EmployeeId": 21,
        "EmployeeName": "ss",
        "EmployeeCode": "10",
        "EmployeeStatus": 1,
        "Security": 0,
        "Rfid": false,
        "rfid_set": []
    },

    {
        "EmployeeId": 1,
        "EmployeeName": "namechagnge",
        "EmployeeCode": "Emp-01",
        "EmployeeStatus": 1,
        "Security": 0,
        "Rfid": true,
        "rfid_set": [
            {
                "RFID": 74,
                "RFIDCode": 408
            }
        ]
    }
]

i want to get the result as shown above. the extra fiels Rfid is not present in model and , its details related to the another model RFID..

How can i get this type of output How can i do this


Solution

  • Use serializers.SerializerMethodField--DRF doc

    class EmployeeSerializer(serializers.ModelSerializer):
        Rfid = serializers.SerializerMethodField()
        # other fields
    
        def get_Rfid(self, instance):
            return instance.rfid_set.exists()
    
        class Meta:
            model = Employee
            fields = [other fields ,'Rfid']