我正在为我的应用创建注册流程。我在让事情正常运行时遇到问题。我的目的是发送一个带有所有必要 JSON 的 POST 请求,以便在 Django 中创建各种模型。
我的错误是在处理坐标时,'lat_long' 有一个 KeyError。我检查了validated_data 发现来自我的JSON 正文的数据没有到达validated_data 并且距离限制也没有?然而,bio、exp、age 和town 都在validated_data 中。为什么是这样?两者都在 ProfileSerializer 中声明,模型似乎是正确的。但是,这两个字段都不存在。
在validated_data: 'genres' 只是 OrderedDict() 里面什么都没有,所以它也不会创建所需的 UserGenre 实例。
对此的任何帮助将不胜感激,我已经尝试解决此问题 4 天无济于事!
附言如果人们可以特别查看序列化程序并告诉我我是否要在一个请求中正确创建多个模型/对象?或者有更好的方法吗?
这里是 models.py(我使用的是 Django 的标准 User 对象,并且有一个只有名字的 Genre 对象)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.CharField(max_length=400, null=True, default=None)
town = models.CharField(max_length=100, null=True, default=None)
age = models.IntegerField(null=False, default=None, validators=[MinValueValidator(13)])
exp = models.IntegerField(null=False, default=None, validators=[MinValueValidator(0)])
distance_limit = models.IntegerField(null=False, default=50, validators=[MinValueValidator(1)])
lat_long = models.PointField(
editable=False,
blank=True,
null=True,
default=None,
)
def __str__(self):
return f'{self.user}'
class UserGenre(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
genre = models.ForeignKey(Genre, on_delete.models.CASCADE)
class Meta:
unique_together(('user','genre'),)
index_together(('user','genre'),)
我有 CreateUserViewSet.py
class CreateUserViewSet(viewsets.ModelViewSet):
serializer_class = CreateUserSerializer
queryset = User.objects.all()
# POST request
@csrf_exempt
def create(self, request, *args, **kwargs):
serializer = CreateUserSerializer(data=request.data)
if serializer.is_valid()
serializer.save()
return Response({'status': 'User created successfully'}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = ('age', 'bio', 'town', 'exp', 'lat_long', 'distance_limit',)
class UserGenreSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField(read_only=True)
user = UserSerializer(read_only=True)
genre = GenreSerializer(read_only=True)
class Meta:
model = UserGenre
fields = ('id', 'user', 'genre')
class CreateUserSerializer(serializers.HyperlinkedModelSerialzier):
profile = ProfileSerializer(required=True)
genres = UserGenreSerializer(required=True)
class Meta:
model = User
fields = ('id','username','email','password','profile','genres',)
extra_kwargs = {'password': {'write_only': True, 'required': True}}
def create(self, validated_data):
profile_data = validated_data.pop('profile')
genre_data = validated_data.pop('genres')
*creating User object, this works as intended*
coords = profile_data['lat_long'].split(",")
new_coords = [float(part) for part in coords]
point = Point(new_coords, srid=4326)
profile = Profile.objects.create(
user=user,
exp=profile_data['exp'],
age=profile_data['age'],
bio=profile_data['bio'],
town=profile_data['town'],
lat_long=profile_data['lat_long'],
distance_limit=profile_data['distance_limit']
)
for i in genres_data:
gen = Genre.objects.get(genre_name=genres_data[i])
genres = UserGenre.objects.create(
user=user,
genre=gen
)
return user
POST 请求数据
{
"username": "testuser",
"email": "testuser@test.sk",
"password": "testpw",
"profile": {
"age": "20",
"bio": "sample bio",
"town": "Berlin",
"exp": "3",
"lat_long": "52.5200,13.4050",
"distance_limit": "30"
},
"genres": {"list": ["Rock", "Indie"]}
}