python-3.x - 如何在 django-rest-framework 中检查数据库中是否存在数据
问题描述
如何检查数据库中是否存在数据,如果数据不存在则创建或返回。我使用了 get_or_create() 但不知何故我得到了错误
NOT NULL 约束处的 IntegrityError 失败
模型类
class UserMobileDevice(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
token = models.CharField(max_length=255)
device_model = models.CharField(max_length=255)
os = models.CharField(max_length=255)
os_version = models.IntegerField(null=True)
build_version = models.CharField(max_length=255, null=True)
manufacturer = models.CharField(max_length=255, null=True)
device = models.CharField(max_length=255, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
序列化器类
class UserMobileSerializer(serializers.ModelSerializer):
#user = serializers.StringRelatedField()
class Meta:
model = models.UserMobileDevice
fields = '__all__'
read_only_fields = ('id',)
def create(self, validated_data):
user, created = models.UserMobileDevice.objects.get_or_create(
token=validated_data.get('token', None),
defaults={'token': validated_data.get('token',None),'os':validated_data.get('os',None),'device_model':validated_data.get('device_model',None),'os_version':validated_data.get('os_version',None),'build_version':validated_data.get('build_version',None),'manufacturer':validated_data.get('manufacturer',None),'device':validated_data.get('device',None)})
return user
查看课程
class UserMobileViewSet(viewsets.ModelViewSet):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
queryset = UserMobileDevice.objects.all()
serializer_class = UserMobileSerializer
def get_queryset(self):
return self.queryset.filter(user=self.request.user)
我不太确定为什么会收到以下错误。任何帮助将不胜感激!
解决方案
你可以在你的序列化器中尝试这样的事情:
class UserMobileSerializer(serializers.ModelSerializer):
#user = serializers.StringRelatedField()
class Meta:
model = models.UserMobileDevice
fields = '__all__'
read_only_fields = ('id', 'user')
def create(self, validated_data):
instance, created = self.Meta.model.objects.get_or_create(**validated_data)
if not created:
raise ValidationError('instance alreaady exists..')
return instance
在您看来:
class UserMobileViewSet(viewsets.ModelViewSet):
authentication_classe(authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
queryset = UserMobileDevice.objects.all()
serializer_class = UserMobileSerializer
def get_queryset(self):
return self.queryset.filter(user=self.request.user)
def perform_create(self, serializer):
user = self.request.user
serializer.save(user=user)
推荐阅读
- python - Python - 正则表达式获取仅打印接口名称和状态
- android - ArrayAdapter 中的 NullPointerException
- javascript - 在nodejs中并行创建多个WebSocket连接
- mysql - 使用 order by 子句时,数据库视图需要很长时间才能获取数据
- sql-server - SQL Server BCP XML 导出
- python - 我可以在创建后或将数据框导出到 sql 表期间在 sql 表中添加主键约束吗
- reactjs - React JS Jest Unit Testing Enzyme Set state for testing
- aws-lambda - 是否可以在 AWS Lambda 上使用 Pytorch?
- angular - 如何将 httpService 返回的字典反序列化为 Angular Map?
- graphql - 我们应该在 Apollo Client 的情况下添加后端 graphql 模式吗?