Cannot cast AnonymousUser to int. Are you trying to use it in place of User?
当我向我的url发出发布请求时,我不确定如何调整我的代码以停止生成此错误。我已经为我的序列化程序、视图和模型附上了代码。
class ActivitySessionSerializer(serializers.Serializer):
activity_name = serializers.CharField(min_length=1, max_length=100)
def create(self, validated_data):
activity, created = Activity.objects.get_or_create(name=validated_data['activity_name'],
owner=self.context['request'].user)
return ActivitySession.objects.create(activity=activity, start_time=datetime.datetime.now())
class StartSessionView(generics.CreateAPIView):
serializer_class = serializers.ActivitySessionSerializer
User = get_user_model()
class ActivityType(models.Model):
name = models.CharField(max_length=100)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Activity(models.Model):
name = models.CharField(max_length=100)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
activity_type = models.ForeignKey(ActivityType, on_delete=models.CASCADE, null=True, blank=True)
class ActivitySession(models.Model):
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
urlpatterns = [
path('starting_session/', views.StartSessionView.as_view()),
]
我相信我通过更改线路解决了这个问题
Activity.objects.get_or_create(name=validated_data['activity_name'],
owner=self.context['request'].user)
至
Activity.objects.get_or_create(name=validated_data['activity_name'],
owner=self.context['request'].user.id)
我必须添加id字段,而不是总的用户对象
只需要添加request.user.id///这肯定会解决。。
对于那些也来这里的人来说,一个可能的错误是(这就是我遇到的(:
您可以通过
foreignkey
或reverse foreignkey
在其他地方调用匿名user
实例。
例如,在我的代码中:
- 我在
CustomView
中收到了匿名请求,如下所示:
class CustomView(RetrieveAPIView):
serializer_class = CustomSerializer
queryset =CustomModel.objects.all()
CustomView
的CustomModel
有一个反向外键-which_model
,如下所示:
from django.contrib.auth import get_user_model
User = get_user_model()
class CustomModel(BaseModel):
name = models.CharField(verbose_name="Custom name", max_length=256)
class CustomRecord(BaseModel):
which_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="related user")
which_model = models.ForeignKey("CustomModel", on_delete=models.CASCADE, verbose_name="related model",related_name="user_record",)
- 为了在匿名请求中获取
CustomModel
实例时同时获取相关的CustomRecord
实例,我在CustomSerializer
中使用了SerializerMethodField
,如下所示:
class CustomSerializer(ModelSerializer):
related_user_record = SerializerMethodField(read_only=True, source="user_record")
def get_related_user_record(self, obj):
# This is where the problem is !!!!
user_record = CustomRecord.objects.filter(
which_model=obj.id, which_user=self.context["request"].user
)
if not user_record:
return None
else:
return CustomRecordSerializer(user_record.get()).data
因为我在get_related_user_record
函数中使用了self.context["request"].user
,django尝试将用户实例的id转换为int;然而,正如@Brad Solomon所说,匿名用户的id或pk为None,这就是错误的来源。老实说,当这个错误发生时,djano没有很好地报告错误源。
为了解决这个问题,我在使用用户实例之前添加了一个检查,看看它是否是匿名用户,如下所示:
def get_related_user_record(self, obj):
# check if it's an anonymous user
if not self.context["request"].user.pk:
return None
# This is where the problem is !!!!
user_record = CustomRecord.objects.filter(
which_model=obj.id, which_user=self.context["request"].user
)
if not user_record:
return None
else:
return CustomRecordSerializer(user_record.get()).data
AnonymousUser
有id=None
和pk=None
,因此在这种情况下不能直接使用。相反,建议创建一个反映匿名用户的用户实例。