如何在DjangoRestFramework的ModelViewSet中声明user_id。

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

How to declare user_id on ModelViewSet in DjangoRestFramework

问题

Foreignkey root is User > Comparelist > obj

我不知道我的代码有什么问题。错误消息告诉我需要 user_id 的 comparelist。

accounts > models.py

  1. from django.db import models
  2. from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
  3. from .managers import UserManager
  4. from core.models import TimestampedModel
  5. class User(AbstractBaseUser, PermissionsMixin, TimestampedModel):
  6. email = models.EmailField(max_length=30, unique=True, null=False, blank=False)
  7. is_superuser = models.BooleanField(default=False)
  8. is_active = models.BooleanField(default=True)
  9. is_staff = models.BooleanField(default=False)
  10. created_at = models.DateTimeField(auto_now_add=True)
  11. updated_at = models.DateTimeField(auto_now=True)
  12. objects = UserManager()
  13. USERNAME_FIELD = 'email'

accounts > serializers.py

  1. from .models import User
  2. from rest_framework import serializers
  3. class UserSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = User
  6. fields = '__all__'
  7. def create(self, validated_data):
  8. user = User.objects.create_user(
  9. email=validated_data['email'],
  10. password=validated_data['password']
  11. )
  12. return user

ImageConverters > models.py

  1. from django.db import models
  2. from accounts.models import User
  3. class CompareList(models.Model):
  4. user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner")
  5. id = models.AutoField(primary_key=True)
  6. created_at = models.DateTimeField(auto_now_add=True)
  7. class Obj(models.Model):
  8. comparelist = models.ForeignKey(CompareList, on_delete=models.CASCADE)
  9. object_name = models.CharField(max_length=100)
  10. image = models.URLField(max_length=500)

ImageConverters > serializers.py

  1. from .models import CompareList, Obj
  2. from rest_framework import serializers
  3. class ObjSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = Obj
  6. fields = ['object_name', 'image']
  7. class CompareListSerializer(serializers.ModelSerializer):
  8. objs = ObjSerializer(many=True, read_only=True)
  9. class Meta:
  10. model = CompareList
  11. fields = ['id', 'objs']
  12. def create(self, validated_data):
  13. images_data = self.context['request'].FILES
  14. texts_data = self.context['request'].data
  15. comparelist = CompareList.objects.create(**validated_data)
  16. for image_data, text_data in zip(images_data.getlist('image'), texts_data.getlist('object_name')):
  17. Obj.objects.create(comparelist=comparelist, image=image_data, object_name=text_data)
  18. return comparelist

ImageConverters > views.py

  1. from rest_framework.viewsets import ModelViewSet
  2. from .models import CompareList, Obj
  3. from .serializers import CompareListSerializer, ObjSerializer
  4. class CompareListCreate(ModelViewSet):
  5. queryset = CompareList.objects.all()
  6. serializer_class = CompareListSerializer
  7. class ObjListCreate(ModelViewSet):
  8. queryset = Obj.objects.all()
  9. serializer_class = ObjSerializer

我向服务器发送了 POST 请求,但我收到了错误消息。

英文:

Foreignkey root is
User> Comparelist > obj

I don't know what's wrong with my code.
Error message said me comparelist required user_id

accounts> models.py

  1. from django.db import models
  2. from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
  3. from .managers import UserManager
  4. from core.models import TimestampedModel
  5. class User(AbstractBaseUser, PermissionsMixin, TimestampedModel):
  6. email = models.EmailField(max_length=30, unique=True, null=False, blank=False)
  7. is_superuser = models.BooleanField(default=False)
  8. is_active = models.BooleanField(default=True)
  9. is_staff = models.BooleanField(default=False)
  10. created_at = models.DateTimeField(auto_now_add=True)
  11. updated_at = models.DateTimeField(auto_now=True)
  12. objects = UserManager()
  13. USERNAME_FIELD = 'email'

accounts> serializers.py

  1. from .models import User
  2. from rest_framework import serializers
  3. class UserSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = User
  6. fields = '__all__'
  7. def create(self, validated_data):
  8. user = User.objects.create_user(
  9. email = validated_data['email'],
  10. password = validated_data['password']
  11. )
  12. return user

ImageConverters> models.py

  1. from django.db import models
  2. from accounts.models import User
  3. class CompareList(models.Model):
  4. user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner")
  5. id = models.AutoField(primary_key=True)
  6. created_at = models.DateTimeField(auto_now_add=True)
  7. class Obj(models.Model):
  8. comparelist = models.ForeignKey(CompareList, on_delete=models.CASCADE)
  9. object_name = models.CharField(max_length=100)
  10. image = models.URLField(max_length=500)

ImageConverters> serializers.py

  1. from .models import CompareList, Obj
  2. from rest_framework import serializers
  3. class ObjSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = Obj
  6. fields = ['object_name', 'image']
  7. class CompareListSerializer(serializers.ModelSerializer):
  8. objs = ObjSerializer(many=True, read_only=True)
  9. class Meta:
  10. model = CompareList
  11. fields = ['id', 'objs']
  12. def create(self, validated_data):
  13. # print(dir(self))
  14. print(self)
  15. print('------------------')
  16. images_data = self.context['request'].FILES
  17. texts_data = self.context['request'].data
  18. comparelist = CompareList.objects.create(**validated_data)
  19. print(texts_data)
  20. for image_data, text_data in zip(images_data.getlist('image'), texts_data.getlist('object_name')):
  21. print(image_data, text_data)
  22. Obj.objects.create(comparelist=comparelist, image=image_data, object_name=text_data)
  23. return comparelist

ImageConverters> views.py

  1. from rest_framework.viewsets import ModelViewSet
  2. from .models import CompareList, Obj
  3. from .serializers import CompareListSerializer, ObjSerializer
  4. class CompareListCreate(ModelViewSet):
  5. queryset = CompareList.objects.all()
  6. serializer_class = CompareListSerializer
  7. class ObjListCreate(ModelViewSet):
  8. queryset = Obj.objects.all()
  9. serializer_class = ObjSerializer

I sent post to server. But I got Error

enter image description here

答案1

得分: 1

你正在尝试创建一个没有用户字段的CompareList对象。这违反了数据库关系,因为用户是必需的才能创建CompareList对象。
如果经过身份验证的用户是CompareList对象的所有者(假设只有授权用户才能执行此操作),请将您的序列化器创建方法更新如下:

  1. def create(self, validated_data):
  2. # print(dir(self))
  3. print(self)
  4. print('------------------')
  5. images_data = self.context['request'].FILES
  6. texts_data = self.context['request'].data
  7. comparelist = CompareList.objects.create(**validated_data, user=self.context['request'].user)
  8. print(texts_data)
  9. for image_data, text_data in zip(images_data.getlist('image'), texts_data.getlist('object_name')):
  10. print(image_data, text_data)
  11. Obj.objects.create(comparelist=comparelist, image=image_data, object_name=text_data)
  12. return comparelist
英文:

You are trying to create a CompareList object without user field. Which violate with database relationship since user is required to create CompareList object.
If authenticated user is the owner of a CompareList object(Assuming only authorized user should be authorized to perform this action). update your serializer create method like this:

  1. def create(self, validated_data):
  2. # print(dir(self))
  3. print(self)
  4. print('------------------')
  5. images_data = self.context['request'].FILES
  6. texts_data = self.context['request'].data
  7. comparelist = CompareList.objects.create(**validated_data, user=self.context['request'].user)
  8. print(texts_data)
  9. for image_data, text_data in zip(images_data.getlist('image'), texts_data.getlist('object_name')):
  10. print(image_data, text_data)
  11. Obj.objects.create(comparelist=comparelist, image=image_data, object_name=text_data)
  12. return comparelist

huangapple
  • 本文由 发表于 2023年8月9日 15:34:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76865549-2.html
匿名

发表评论

匿名网友

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

确定