出于某種原因,下面的代碼是不設定hash_tags下的屬性Post。我檢查的方法是return Response在行處放置一個斷點,view.py然后檢查新創建的Post物件,該hash_tags屬性剛剛回傳一個空串列。同樣,當我閱讀serializer.data,hash_tags也是一個空串列。即使 HashTag 表清楚地創建了在正文中找到的哈希標簽。這是怎么回事?
模型.py
class Post(AbstractBaseModel):
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
join_goal = models.ForeignKey(JoinGoal, on_delete=models.CASCADE)
body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
hash_tags = models.ManyToManyField(HashTag)
type = models.CharField(
choices=PostType.choices,
max_length=50,
)
class HashTag(models.Model):
hash_tag = models.CharField(max_length=140, primary_key=True, validators=[
MinLengthValidator(1)])
序列化器.py
class HashTagSerializer(serializers.ModelSerializer):
class Meta:
model = HashTag
fields = ['hash_tag']
class PostSerializer(serializers.ModelSerializer):
hash_tags = HashTagSerializer(many=True, read_only=True)
class Meta:
model = Post
fields = ('creator', 'join_goal', 'body', 'uuid', 'created', 'type', 'updated_at', 'hash_tags')
查看.py
@api_view(['POST'])
def post_create_update_post(request):
user_uuid = str(request.user.uuid)
request.data['creator'] = user_uuid
request.data['type'] = PostType.UPDATE
post_text = request.data['body']
hash_tags_list = extract_hashtags(post_text)
hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0].hash_tag for ht in hash_tags_list]
request.data['hash_tags'] = hash_tags
try:
with transaction.atomic():
serializer = PostSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
post_obj = serializer.save()
except Exception as e:
return Response(dict(error=str(e),
user_message=error_message_generic),
status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
我也嘗試不設定read_only=True并收到此錯誤
這導致ValidationError({'hash_tags': [ErrorDetail(string='This field is required.', code='required')]})與request.data['hash_tags']= [“測驗”]
uj5u.com熱心網友回復:
您設定了read_only=True這就是為什么 hash_tags 值沒有保存在資料庫中的原因。
hash_tags = HashTagSerializer(many=True, read_only=True)
像這樣在沒有 read_only 的情況下宣告它:
hash_tags = HashTagSerializer(many=True)
uj5u.com熱心網友回復:
我相信您必須覆寫嵌套序列化程式的createandupdate方法serializer.py:
class HashTagSerializer(serializers.ModelSerializer):
class Meta:
model = HashTag
fields = ['hash_tag']
class PostSerializer(serializers.ModelSerializer):
hash_tags = HashTagSerializer(many=True, read_only=True)
class Meta:
model = Post
fields = ('creator', 'join_goal', 'body', 'uuid', 'created', 'type', 'updated_at', 'hash_tags')
def create(self, validated_data):
hash_tags_data = validated_data.pop('hash_tags')
post = Post.objects.create(**validated_data)
for data in hash_tags_data:
hash_tag = HashTag.objects.get_or_create(**data)
post.hash_tags.add(hash_tag)
post.save()
return post
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322271.html
