Field ‘id’ 期望是一个数字,但收到了<User: Aditya@123>。

huangapple go评论86阅读模式
英文:

Field 'id' expected a number but got <User: Aditya@123>

问题

I am using nested serializer for Django user module and BookDetail where user is Foreign key in BookDetail model. For perform_create method I am getting this error. Instead of considering id, self.request.user is considering username

  1. class BookDetailsList(ListCreateAPIView):
  2. serializer_class = BookDetailsSerializer
  3. permission_classes = (permissions.IsAuthenticated,)
  4. def perform_create(self, serializer):
  5. serializer.save(user_id=self.request.user)
  6. def get_queryset(self):
  7. return Book_Detail.objects.filter(user_id=self.request.user)

I tried different ways to get id but I am always getting <User: Aditya@123>. I am expecting to get User Model "id" in perform_create method

models.py

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. class Book_Detail(models.Model):
  4. # ...
  5. user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='user')

serializers.py

  1. from authentication.serializers import UserSerializer
  2. class BookDetailsSerializer(ModelSerializer):
  3. user = UserSerializer(read_only=True)
  4. class Meta:
  5. model = Book_Detail
  6. fields = '__all__'

view.py

  1. from .models import Book_Detail
  2. from .serializers import BookDetailsSerializer
  3. from rest_framework import permissions
  4. class BookDetailsList(ListCreateAPIView):
  5. serializer_class = BookDetailsSerializer
  6. permission_classes = (permissions.IsAuthenticated,)
  7. def perform_create(self, serializer):
  8. serializer.save(user_id=self.request.user)
  9. def get_queryset(self):
  10. return Book_Detail.objects.filter(user_id=self.request.user)

I am getting this error

  1. Internal Server Error: /api/sell/
  2. Traceback (most recent call last):
  3. File "C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py", line 2018, in get_prep_value
  4. return int(value)
  5. ^^^^^^^^^^
  6. TypeError: int() argument must be a string, a bytes-like object or a real number, not 'User'
  7. # ... (rest of the error traceback)

The error is related to the user field in your serializer. You may need to adjust your serializer or model to correctly save the user ID.

英文:

I am using nested serializer for Django user module and BookDetail where user is Foreign key in BookDetail model. For perform_create method I am getting this error. Instead of considering id, self.request.user is considering username

  1. class BookDetailsList(ListCreateAPIView):
  2. serializer_class = BookDetailsSerializer
  3. permission_classes = (permissions.IsAuthenticated,)
  4. def perform_create(self, serializer):
  5. serializer.save(user_id=self.request.user)
  6. def get_queryset(self):
  7. return Book_Detail.objects.filter(user_id=self.request.user)

I tried different ways to get id but I am always getting <User: Aditya@123>. I am expecting to get User Model "id" in perform_create method

models.py

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. class Book_Detail(models.Model):
  4. def nameFile(instance, filename):
  5. user = User.objects.get(username=instance.user_id)
  6. return &#39;/&#39;.join([str(user.username), filename])
  7. book_isbn = models.CharField(max_length=15)
  8. book_name = models.CharField(max_length=255)
  9. book_page = models.IntegerField()
  10. book_medium = models.CharField(max_length=20)
  11. book_author = models.CharField(max_length=255)
  12. book_genre = models.CharField(max_length=20)
  13. book_cover_page = models.ImageField(upload_to=nameFile, blank=True)
  14. book_last_page = models.ImageField(upload_to=nameFile, blank=True)
  15. book_page1 = models.ImageField(upload_to=nameFile, blank=True)
  16. book_page2 = models.ImageField(upload_to=nameFile, blank=True)
  17. book_page3 = models.ImageField(upload_to=nameFile, blank=True)
  18. book_rental = models.CharField(max_length=20, null=True, blank=True)
  19. book_price = models.FloatField()
  20. book_description = models.TextField(null=True, blank=True)
  21. status = models.CharField(max_length=45)
  22. posted_date = models.DateField(null=True)
  23. user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name=&#39;user&#39;)

serializers.py

  1. from authentication.serializers import UserSerializer
  2. class BookDetailsSerializer(ModelSerializer):
  3. user = UserSerializer(read_only=True)
  4. class Meta:
  5. model = Book_Detail
  6. fields = &#39;__all__&#39;

view.py

  1. from .models import Book_Detail
  2. from .serializers import BookDetailsSerializer
  3. from rest_framework import permissions
  4. class BookDetailsList(ListCreateAPIView):
  5. serializer_class = BookDetailsSerializer
  6. permission_classes = (permissions.IsAuthenticated,)
  7. def perform_create(self, serializer):
  8. serializer.save(user_id=self.request.user)
  9. def get_queryset(self):
  10. return Book_Detail.objects.filter(user_id=self.request.user)

I am getting this error

  1. Internal Server Error: /api/sell/
  2. Traceback (most recent call last):
  3. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2018, in get_prep_value
  4. return int(value)
  5. ^^^^^^^^^^
  6. TypeError: int() argument must be a string, a bytes-like object or a real number, not &#39;User&#39;
  7. The above exception was the direct cause of the following exception:
  8. Traceback (most recent call last):
  9. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\serializers.py&quot;, line 962, in create
  10. instance = ModelClass._default_manager.create(**validated_data)
  11. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  12. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\manager.py&quot;, line 85, in manager_method
  13. return getattr(self.get_queryset(), name)(*args, **kwargs)
  14. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  15. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\query.py&quot;, line 671, in create
  16. obj.save(force_insert=True, using=self.db)
  17. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 812, in save
  18. self.save_base(
  19. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 863, in save_base
  20. updated = self._save_table(
  21. ^^^^^^^^^^^^^^^^^
  22. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 1006, in _save_table
  23. results = self._do_insert(
  24. ^^^^^^^^^^^^^^^^
  25. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 1047, in _do_insert
  26. return manager._insert(
  27. ^^^^^^^^^^^^^^^^
  28. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\manager.py&quot;, line 85, in manager_method
  29. return getattr(self.get_queryset(), name)(*args, **kwargs)
  30. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  31. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\query.py&quot;, line 1791, in _insert
  32. return query.get_compiler(using=using).execute_sql(returning_fields)
  33. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  34. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1659, in execute_sql
  35. for sql, params in self.as_sql():
  36. ^^^^^^^^^^^^^
  37. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1583, in as_sql
  38. value_rows = [
  39. ^
  40. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1584, in &lt;listcomp&gt;
  41. [
  42. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1585, in &lt;listcomp&gt;
  43. self.prepare_value(field, self.pre_save_val(field, obj))
  44. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1523, in prepare_value
  45. value = field.get_db_prep_save(value, connection=self.connection)
  46. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  47. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\related.py&quot;, line 1144, in get_db_prep_save
  48. return self.target_field.get_db_prep_save(value, connection=connection)
  49. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  50. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 925, in get_db_prep_save
  51. return self.get_db_prep_value(value, connection=connection, prepared=False)
  52. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  53. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2703, in get_db_prep_value
  54. value = self.get_prep_value(value)
  55. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  56. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2020, in get_prep_value
  57. raise e.__class__(
  58. TypeError: Field &#39;id&#39; expected a number but got &lt;User: Aditya@123&gt;.
  59. During handling of the above exception, another exception occurred:
  60. Traceback (most recent call last):
  61. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\core\handlers\exception.py&quot;, line 56, in inner
  62. response = get_response(request)
  63. ^^^^^^^^^^^^^^^^^^^^^
  64. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\core\handlers\base.py&quot;, line 197, in _get_response
  65. response = wrapped_callback(request, *callback_args, **callback_kwargs)
  66. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  67. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\views\decorators\csrf.py&quot;, line 55, in wrapped_view
  68. return view_func(*args, **kwargs)
  69. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  70. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\views\generic\base.py&quot;, line 103, in view
  71. return self.dispatch(request, *args, **kwargs)
  72. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  73. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\views.py&quot;, line 509, in dispatch
  74. response = self.handle_exception(exc)
  75. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  76. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\views.py&quot;, line 469, in handle_exception
  77. self.raise_uncaught_exception(exc)
  78. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\views.py&quot;, line 480, in raise_uncaught_exception
  79. raise exc
  80. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\views.py&quot;, line 506, in dispatch
  81. response = handler(request, *args, **kwargs)
  82. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  83. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\generics.py&quot;, line 242, in post
  84. return self.create(request, *args, **kwargs)
  85. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  86. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\mixins.py&quot;, line 19, in create
  87. self.perform_create(serializer)
  88. File &quot;C:\Users\Aditya Pandit\Desktop\bookmart\bookmart\sell\views.py&quot;, line 15, in perform_create
  89. serializer.save(user_id=self.request.user)
  90. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\serializers.py&quot;, line 212, in save
  91. self.instance = self.create(validated_data)
  92. ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  93. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\serializers.py&quot;, line 981, in create
  94. raise TypeError(msg)
  95. TypeError: Got a `TypeError` when calling `Book_Detail.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `Book_Detail.objects.create()`. You may need to make the field read-only, or override the BookDetailsSerializer.create() method to handle this correctly.
  96. Original exception was:
  97. Traceback (most recent call last):
  98. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2018, in get_prep_value
  99. return int(value)
  100. ^^^^^^^^^^
  101. TypeError: int() argument must be a string, a bytes-like object or a real number, not &#39;User&#39;
  102. The above exception was the direct cause of the following exception:
  103. Traceback (most recent call last):
  104. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\rest_framework\serializers.py&quot;, line 962, in create
  105. instance = ModelClass._default_manager.create(**validated_data)
  106. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  107. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\manager.py&quot;, line 85, in manager_method
  108. return getattr(self.get_queryset(), name)(*args, **kwargs)
  109. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  110. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\query.py&quot;, line 671, in create
  111. obj.save(force_insert=True, using=self.db)
  112. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 812, in save
  113. self.save_base(
  114. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 863, in save_base
  115. updated = self._save_table(
  116. ^^^^^^^^^^^^^^^^^
  117. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 1006, in _save_table
  118. results = self._do_insert(
  119. ^^^^^^^^^^^^^^^^
  120. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\base.py&quot;, line 1047, in _do_insert
  121. return manager._insert(
  122. ^^^^^^^^^^^^^^^^
  123. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\manager.py&quot;, line 85, in manager_method
  124. return getattr(self.get_queryset(), name)(*args, **kwargs)
  125. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  126. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\query.py&quot;, line 1791, in _insert
  127. return query.get_compiler(using=using).execute_sql(returning_fields)
  128. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  129. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1659, in execute_sql
  130. for sql, params in self.as_sql():
  131. ^^^^^^^^^^^^^
  132. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1583, in as_sql
  133. value_rows = [
  134. ^
  135. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1584, in &lt;listcomp&gt;
  136. [
  137. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1585, in &lt;listcomp&gt;
  138. self.prepare_value(field, self.pre_save_val(field, obj))
  139. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\sql\compiler.py&quot;, line 1523, in prepare_value
  140. value = field.get_db_prep_save(value, connection=self.connection)
  141. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  142. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\related.py&quot;, line 1144, in get_db_prep_save
  143. return self.target_field.get_db_prep_save(value, connection=connection)
  144. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  145. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 925, in get_db_prep_save
  146. return self.get_db_prep_value(value, connection=connection, prepared=False)
  147. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  148. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2703, in get_db_prep_value
  149. value = self.get_prep_value(value)
  150. ^^^^^^^^^^^^^^^^^^^^^^^^^^
  151. File &quot;C:\Users\Aditya Pandit\.virtualenvs\bookmart-ugZrwS1X\Lib\site-packages\django\db\models\fields\__init__.py&quot;, line 2020, in get_prep_value
  152. raise e.__class__(
  153. TypeError: Field &#39;id&#39; expected a number but got &lt;User: Aditya@123&gt;.

答案1

得分: 2

user_id 是一个特殊术语,表示用户的字面主键,但 request.user 是用户对象。

有两种方法可以实现这一点:

使用对象
  1. # 没有 _id
  2. serializer.save(user=self.request.user)
使用主键
  1. # user.pk
  2. serializer.save(user_id=self.request.user.pk)

编辑

只是为了澄清,这个 _id 关键字适用于所有外键:{field}_id

英文:

user_id is a special term which means the literal PK of User, but request.user is the User object

Two ways you can do this:

Using the object
  1. # No _id
  2. serializer.save(user=self.request.user)
Using the PK
  1. # user.pk
  2. serializer.save(user_id=self.request.user.pk)

Edit

Just to clarify, this _id keyword works for all ForeignKeys: {field}_id

答案2

得分: 0

For both filtering and creating, you use the primary key of the user:

  1. class BookDetailsList(ListCreateAPIView):
  2. serializer_class = BookDetailsSerializer
  3. permission_classes = (permissions.IsAuthenticated,)
  4. def perform_create(self, serializer):
  5. serializer.save(user_id=self.request.user.pk)
  6. def get_queryset(self):
  7. return BookDetail.objects.filter(user_id=self.request.user.pk)

Note: Models in Django are written in PascalCase, not snake_case, so you might want to rename the model from Book_Detail to BookDetail.

英文:

For both filtering and creating, you use the primary key of the user:

<pre><code>class BookDetailsList(ListCreateAPIView):

  1. serializer_class = BookDetailsSerializer
  2. permission_classes = (permissions.IsAuthenticated,)
  3. def perform_create(self, serializer):
  4. serializer.save(&lt;b&gt;user_id=self.request.user.pk&lt;/b&gt;)
  5. def get_queryset(self):
  6. return Book_Detail.objects.filter(&lt;b&gt;user_id=self.request.user.pk&lt;/b&gt;)&lt;/code&gt;&lt;/pre&gt;

> Note: Models in Django are written in PascalCase, not snake_case,
> so you might want to rename the model from <s>Book_Detail</s> to BookDetail.

huangapple
  • 本文由 发表于 2023年4月10日 22:53:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/75978150.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定