【问题标题】:How do I send response data form multiple tables via django rest framework如何通过 django rest 框架从多个表中发送响应数据
【发布时间】:2021-10-12 13:34:15
【问题描述】:

我想发送 Response(xyzSerializer.data),其中 xyzSerializer 从两个模型(即用户和客户)序列化数据以使其遵循正文/外观

{
'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
}

但是,目前我可以单独序列化用户或客户模型,分别给出以下输出,

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
}

我想加入来自两个模型的数据使用

用户ID

并将其作为响应发送。

这是我的用户和客户模型,

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)

注意:如果我的问题不清楚,请联系我进行澄清

【问题讨论】:

    标签: django serialization django-rest-framework response django-serializer


    【解决方案1】:

    使用嵌套序列化器:

    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)
    

    【讨论】:

    • 嘿,我听从了你的建议,但这给了我一个 AttributeError。这是完整的错误消息:尝试在序列化程序 UserSerializer 上获取字段 customer_set 的值时出现属性错误。序列化程序字段可能命名不正确,并且与 Users 实例上的任何属性或键都不匹配。原始异常文本是:“用户”对象没有属性“客户集”。
    • 问题解决了!谢谢。我所要做的就是不命名我的变量 customer_set,而是将其命名为 userID,它解决了我的问题
    猜你喜欢
    • 2022-01-07
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2019-11-17
    • 2018-09-13
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多