TypeError:字段'id'期望一个数字,但在0x048C7E90>得到<django.contrib.auth.models.AnonymousUser对象


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///这肯定会解决。。

对于那些也来这里的人来说,一个可能的错误是(这就是我遇到的(:

您可以通过foreignkeyreverse foreignkey在其他地方调用匿名user实例。

例如,在我的代码中:

  1. 我在CustomView中收到了匿名请求,如下所示:
class CustomView(RetrieveAPIView):
serializer_class = CustomSerializer
queryset =CustomModel.objects.all()
  1. CustomViewCustomModel有一个反向外键-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",)
  1. 为了在匿名请求中获取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

AnonymousUserid=Nonepk=None,因此在这种情况下不能直接使用。相反,建议创建一个反映匿名用户的用户实例。

相关内容

最新更新