django - 如何获取具有特定键的模型对象
问题描述
我不想发布整个Server
json,而是只想发布ip
字段并从它的模型中获取对象。
但是如果我发布数据,它就会抱怨;如果我使用其他键而不是Server
通过创建发布ServerIP = serializers.CharField()
,它会显示 AttributeError。我怎样才能做到这一点?
curl -X POST --header 'Content-Type: application/json' --header 'Accept: text/plain' -d ' \
{ \
"Destination": "destination information", \
"Server": "165.213.100.100" \
} \
' 'http://localhost:8001/api/server/registration'
{
"Server": {
"non_field_errors": [
"Invalid data. Received str instead of dictionary."
]
}
}
class Server(models.Model):
class Meta:
unique_together = ('ip',)
hostname = models.CharField(default=None, null=True, blank=True, max_length=100)
ip = models.GenericIPAddressField(default=None, null=True, blank=True)
class Registration(models.Model):
class Meta:
unique_together = ('Server', 'Destination')
Server = models.ForeignKey(Server, default=None, blank=True, \
null=True, on_delete=models.SET_NULL, related_name='firewall_server')
Destination = models.CharField(default=None, blank=True, null=True, max_length=100)
class RegistrationView(ListCreateAPIView):
serializer_class = RegistrationSerializer
queryset = Registration.objects.all()
def get_serializer(self, *args, **kwargs):
if self.request.method.lower() == 'post':
data = kwargs.get('data')
kwargs['many'] = isinstance(data, list)
return super(RegistrationView, self).get_serializer(*args, **kwargs)
def perform_create(self, serializer):
return serializer.save()
class RegistrationSerializer(serializers.ModelSerializer):
class Meta:
model = Registration
fields = '__all__'
validators = []
Server = ServerSerializer(read_only=False, many=False, required=False)
def create(self, validated_data):
destination = validated_data.pop('Destination')
server_ip = validated_data.pop('Server') # <<= Here. It can't parse string.
server = Server.objects.get(ip=server_ip)
serialized, _ = Registration.objects.update_or_create(
Type=security_type, Server=server, Destination=destination,
defaults=validated_data)
return serialized
解决方案
由于您使用的是嵌套序列化程序,因此 DRF 在反序列化过程中需要一个类似字典的对象。
class RegistrationSerializer(serializers.ModelSerializer):
# other piece of code
Server = serializers.CharField()
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['Server'] = ServerSerializer(instance.Server).data
return rep
推荐阅读
- dask - 重启 Dask Kubernetes 集群的正确方法是什么?
- reactjs - PWA - 对根路径和子路径做出反应
- java - 在本地使用嵌入式 redis 测试用例运行时面临生菜连接被拒绝问题运行良好,但在詹金斯它失败了
- amazon-web-services - 遍历字典列表以创建具有不同值的 terraform 资源
- javascript - 使用正则表达式匹配表达式
- docker - Docker:以分离模式、交互模式运行从脚本创建的映像
- bash - 如何将一个文件连接到多个文件?
- sql - 对于表的每一行,对另一个表的每一行运行函数
- kotlin - 如何伪造 kapt 注释的多通道
- linux - sendmail 向电子邮件添加第二个附件