我正在用Django开发一个讨论应用程序,它有线程、帖子、回复和投票。选票使用Generic Foreign Keys and Content Types确保用户只能在特定的线程/帖子/回复上投票一次。
投票模式如下:
VOTE_TYPE = (
(-1, 'DISLIKE'),
(1, 'LIKE'),
)
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ("Thread", "Reply", "Post")},
related_name="votes")
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.IntegerField(choices=VOTE_TYPE)
objects = GetOrNoneManager()
class Meta():
unique_together = [('object_id', 'content_type', 'user')]投票序列化程序:
class VoteSerializer(serializers.ModelSerializer):
class Meta:
model = Vote处理投票的观点:
@api_view(['POST'])
def discussions_vote(request):
if not request.user.is_authenticated():
return Response(status=status.HTTP_404_NOT_FOUND)
data = request.DATA
if data['obj_type'] == 'thread':
content_type = ContentType.objects.get_for_model(Thread)
print content_type.id
info = {
'content_type': content_type.id,
'user': request.user.id,
'object_id': data['obj']['id']
}
vote = Vote.objects.get_or_none(**info)
info['vote'] = data['vote']
ser = VoteSerializer(vote, data=info)
if ser.is_valid():
print "Valid"
else:
pprint.pprint(ser.errors)
return Response()request.DATA内容:
{u'vote': -1,
u'obj_type': u'thread',
u'obj':
{
...
u'id': 7,
...
}
}当我投票时,Django Rest Framework序列化程序抛出一个错误:
Model content type with pk 149 does not exist. 149是线程模型的ContentType的正确id,根据
print content_type.id我几乎不知道是什么导致了这一切.
发布于 2014-02-27 15:13:45
问题可能是其中有一个通用外键,它可以链接到任何类型的模型实例,因此没有默认的REST框架方式来决定如何表示序列化的数据。
看看序列化器中GFK上的文档,希望它能帮助您开始工作.http://www.django-rest-framework.org/api-guide/relations#generic-relationships
如果仍然存在问题,那么只需完全放弃使用序列化器,只需在视图中显式执行验证,并返回要用于表示的任何值的字典。
https://stackoverflow.com/questions/22069806
复制相似问题