DRF-使用视图、序列化程序和外键将一个对象关联到另一个对象



基本上我有两个一对一关系的模型。当我打电话给另一个时,我想从其中一个检索信息。

我的型号:

class Customer(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)    

class CurrentAccount(models.Model):
customer_account = models.ForeignKey(Customer, on_delete=models.CASCADE, 
related_name='customer_account', blank=True, null=True)
balance = models.FloatField()

所以我可以调用POST并创建一个客户,该客户将具有id、first_name和last_name。现在一切都在运转。

但是,当我试图调用我的端点来创建一个CurrentAccount,通知我的客户进行关联时,什么也没发生。

我的输入:

{
"customer_account": 1 #this is some id from an Customer that is already created,
"balance": 0.0
}

我期望的输出:

{
"id": 42,
"customer_account": {
"id": 2,
"first_name": "Michele",
"last_name": "Obama"
}
"balance": 0.0
}

我收到的输出:

{
"id": 4,
"balance": 0.0
}

正如您所看到的,Django忽略了关系(在数据库中,字段"customer_account_id"也为null,所以这不仅仅是我返回的问题(。

这是我的序列化程序:

class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'first_name', 'last_name')

class CurrentAccountSerializer(serializers.ModelSerializer):
customer_account = CustomerSerializer(read_only=True)
class Meta:
model = CurrentAccount
fields = ('id', 'customer_account', 'balance')

以及我对创建CurrentAccount:的看法

@api_view(['GET', 'POST'])
def currentaccount_list_view(request):
if request.method == 'GET':
try:
data = CurrentAccount.objects.all()
ser = CurrentAccountSerializer(data, many=True)
return response_success(data=ser.data)
except Exception as e:
return response_failed(e.args)

elif request.method == 'POST':
try:
ser = CurrentAccountSerializer(data=request.data, context={'request': request})
if ser.is_valid():
ser.save()
return response_success(data=ser.data)
else:
return response_failed('Something wrong with the input data')
except Exception as e:
return response_failed(e.args)

因此,我基本上想了解Django上的关系是如何工作的,以及如何使用序列化程序处理DRF上下文。我已经看了医生,但还是不明白。

问题在于CurrentAccountSerializer序列化程序,您将customer_account字段设置为只读。您还应该使用两个带有CurrentAccount的序列化程序,第一个列出现有实例,第二个创建新实例。

序列化程序

class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'first_name', 'last_name')

class CurrentAccountInfoSerializer(serializers.ModelSerializer):
customer_account = CustomerSerializer(read_only=True)
class Meta:
model = CurrentAccount
fields = ('id', 'customer_account', 'balance')

class CurrentAccountCreationSerializer(serializers.ModelSerializer):
customer_account = serializers.PrimaryKeyRelatedField(queryset=Customer.objests.all())
class Meta:
model = CurrentAccount
fields = ('id', 'customer_account', 'balance')
def create(self, validated_data):
return CurrentAccount.objects.create(**validated_data)

视图

@api_view(['GET', 'POST'])
def currentaccount_list_view(request):
if request.method == 'GET':
try:
data = CurrentAccount.objects.all()
ser = CurrentAccountInfoSerializer(data, many=True)
return response_success(data=ser.data)
except Exception as e:
return response_failed(e.args)

elif request.method == 'POST':
try:
ser = CurrentAccountCreationSerializer(data=request.data, context={'request': request})
if ser.is_valid():
instance = ser.save()
return response_success(data=CurrentAccountInfoSerializer(instance=instance).data)
else:
return response_failed('Something wrong with the input data')
except Exception as e:
return response_failed(e.args)

相关内容

最新更新