Как отправить ответные данные из нескольких таблиц через django rest framework

Я хочу отправить Response(xyzSerializer.data), где xyzSerializer сериализует данные двух моделей, т.е. Users и Customers, чтобы дать ему следующее тело/вид

{
'userID': 1, 
'firstName': 'name', 
'lastName': 'Lname', 
'gender': 'Male', 
'country': 'Cloc', 
'city': 'City', 
'phoneNumber': '12345', 
'dob': 'dd-mm-yy', 
'dateJoined': 'dd-mm-yy', 
'role': 'blogger', 
'user': 1
'customerID': 1,
'occupation': '',
'blogger': True,
'userID': 1
}

Но в настоящее время я могу либо сериализовать модель Users, либо модель Customers по отдельности, что дает следующие результаты соответственно,

UserSerializer
{
'userID': 1, 
'firstName': 'name', 
'lastName': 'Lname', 
'gender': 'Male', 
'country': 'Cloc', 
'city': 'City', 
'phoneNumber': '12345', 
'dob': 'dd-mm-yy', 
'dateJoined': 'dd-mm-yy', 
'role': 'blogger', 
'user': 1
}

CustomerSerializer
{
'customerID': 1,
'occupation': '',
'blogger': True,
'userID': 1
}

Я хочу объединить данные из двух моделей с помощью

userID

и отправить это в качестве ответа.

Вот мои модели пользователей и клиентов,

class Users(models.Model):
    userID = models.AutoField(primary_key=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    firstName = models.TextField()
    lastName = models.TextField()    
    gender = models.TextField()
    country = models.TextField()
    city = models.TextField()
    phoneNumber = models.TextField()
    dob = models.TextField()
    dateJoined = models.TextField()
    role = models.TextField()
    def __str__(self):
        return f"ID: {self.userID}"

class Customers(models.Model):
    customerID = models.AutoField(primary_key=True)
    userID = models.ForeignKey('Users', on_delete=models.CASCADE, name="userID")
    occupation = models.TextField()
    blogger = models.BooleanField(default= False)
    def __str__(self):
        return f"ID: {self.customerID}"

Вот мои сериализаторы,

class UserSerializer(ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'

class CustomerSerializer(ModelSerializer):
    class Meta:
        model = Customers
        fields = '__all__'

Вот мое мнение:

@api_view(['GET'])
def getUserByIDDemo(request, uName, pWord):    
    username = uName
    password = pWord
    userObj = authenticate(request, username=username, password=password)

        # Check if authentication successful
    if userObj is not None:
        login(request, userObj)
        currentUser = Users.objects.get(user = userObj)
        userializer = UserSerializer(currentUser, many = False)
        customer = Customers.objects.get(customerID = userializer.data['userID'])
        cserializer = CustomerSerializer(customer, many = False)
        print(userializer.data)
        print(cserializer.data)
        
        #following two lines I tried concatinating data but that gave error
        #xyz = cserializer.data + userializer.data
        #print(xyz)
        
        #Here I want to send data from both models joined by userID
        return Response(cserializer.data)
    else:
        message = "Invalid username and/or password."
        return Response(message)

Примечание: Если мой вопрос непонятен, пожалуйста, свяжитесь со мной для уточнения

Использовать вложенный сериализатор:

class CustomerSerializer(ModelSerializer):
    class Meta:
        model = Customers
        fields = '__all__'


class UserSerializer(ModelSerializer):
    customers_set = CustomerSerializer(many=True)

    class Meta:
        model = Users
        fields = '__all__'

Тогда просто используйте UserSerializer в своем представлении:

...
userializer = UserSerializer(currentUser)
Вернуться на верх