如何使用相关的序列化器Django Rest框架进行发布请求

亚马法沙

我有一个模型,Package其中包含SupplierPackageSize,外键以及一个字段,该字段也是的外键,Shipping model其中包含供应商要运送包裹的位置,因此为了确保用户可以在一个请求中提交全部信息,我创建了序列化器并像这样链接他们。

serializers.py

from users.models import Supplier
from packages.models import Package , PackageSize , ShippingLocation , Shipping

    class ShippingLocationSerializer(serializers.ModelSerializer):
        class Meta:
            model= ShippingLocation
            fields = ['latitude','longitude']
        def create(self, validated_data):
            return ShippingLocation(**validated_data)

    class PackageSizeSerializer(serializers.ModelSerializer):
        class Meta:
            model= PackageSize
            fields = ['length', 'width' ,'height' ,'weight']
        def create(self, validated_data):
            """
            docstring
            """
            pass

    class ShippingSerializer(serializers.ModelSerializer):
        location = ShippingLocationSerializer(source='location_set')
        class Meta:
            model = Shipping
            fields = [
                'first_name', 
                'last_name',
                'phone_number',
                'email',
                'street_address',
                'village',
                'district',
                'country',
                'location'
                ]
        def create(self, validated_data):
            """
            docstring
            """
            pass

    class SupplierPackageSerializer(serializers.ModelSerializer):
        size = PackageSizeSerializer(source='size_set')
        shipping_location= ShippingSerializer(source='to_set')
        class Meta:
            model = Package
            fields = ['supplier', 'name', 'size', 'shipping_location', ]
            read_only_fields = ['supplier']
        
        def create(self, validated_data):
            user =Supplier.objects.get(username=self.context['request'].user)
            return Package(supplier=user, **validated_data )

并像这样创造了我的观点

view.py

from rest_framework import generics
from packages.models import Package
from .serializers import , SupplierPackageSerializer
from rest_framework.permissions import IsAuthenticated

class SupplierPackageViewSet(generics.ListCreateAPIView):
    serializer_class = SupplierPackageSerializer
    queryset = Package.objects.all().order_by('-name')
    permission_classes = [IsAuthenticated]
    

models.py

from django.db import models    
from django.conf import settings
from users.models import Supplier

class ShippingLocation(models.Model):
    latitude = models.IntegerField()
    longitude = models.IntegerField()

class Shipping (models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    phone_number =  models.CharField(max_length=14)
    email = models.EmailField()
    street_address = models.CharField(max_length=30)
    village = models.CharField(max_length=30)
    district = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    location = models.OneToOneField(ShippingLocation , default=None, on_delete=models.CASCADE )

    # Returns the string representation of the model.
    def __str__(self):
        return self.email

class PackageSize(models.Model):
    length = models.IntegerField()
    width = models.IntegerField()
    height = models.IntegerField()
    weight = models.IntegerField()

# Create your models here.
class Package(models.Model):
    TYPE = (
        ('1', 'Envelope'),
        ('2', 'Parcel'),
        ('2', 'Soft'),
        ('2', 'Freezed'),
    )
    TYPE = (
        ('1', 'CREATED IN SYSTEM'),
        ('2', ''),
        ('2', 'Soft'),
        ('2', 'Freezed'),
    )
    name = models.CharField(max_length=30)
    supplier = models.ForeignKey( Supplier , on_delete=models.DO_NOTHING)
    to =  models.ForeignKey(Shipping, default=None, on_delete=models.CASCADE )
    size = models.ForeignKey( PackageSize, default=None, on_delete=models.CASCADE )
    type = models.CharField(max_length=1, default="1", choices=TYPE)
    
    def __str__(self):
        return self.name

挑战在于,当我提交数据时,它可以很好地验证但无法保存,并且出现此错误

TypeError at /supplier/package
Package() got an unexpected keyword argument 'size_set'
伊利纳克

Model Package具有PackageSize的外键(每个包只有一个大小),因此来源不是,size_set而仅仅是size

    size = PackageSizeSerializer()

编辑:

您还必须重写创建串行方法来保存相关对象记录在可写嵌套串行

一系列的东西

def create(self, validated_data):
        size_data= validated_data.pop('size', None)
        if size_data:
            package_size= PackageSize.objects.get_or_create(**size_data)[0]
            validated_data['size'] = package_size
        return Package.objects.create(**validated_data)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

发布请求Django REST框架

来自分类Dev

Django Rest Framework序列化器-返回相关字段

来自分类Dev

Django REST框架:在序列化器中获取相关模型的字段

来自分类Dev

如何使用Django rest框架反序列化Foreignkey?

来自分类Dev

django rest框架序列化相关字段

来自分类Dev

如何在django rest框架中将相关字段包括到模型序列化中?

来自分类Dev

Django Rest Framework序列化在发布请求时失败

来自分类Dev

使用django rest框架的跨站点发布请求

来自分类Dev

在使用stream-django和django rest框架进行扩充的过程中,如何序列化对象?

来自分类Dev

如何使用Django Rest Framework将url字段添加到序列化器

来自分类Dev

如何使用Django Rest Framework序列化器构建JSON响应?

来自分类Dev

Django Rest Framework-在序列化器中获取相关模型字段

来自分类Dev

Django Rest Framework嵌套的序列化器未显示相关数据

来自分类Dev

实例化时Django REST框架序列化器错误

来自分类Dev

Django REST框架扁平,可读写序列化器

来自分类Dev

在Django Rest框架中修改序列化器的输出

来自分类Dev

Mongoengine序列化器错误| Python | Django Rest框架

来自分类Dev

django rest框架外键序列化器问题

来自分类Dev

实例化时Django REST框架序列化器错误

来自分类Dev

django rest 框架 - 全局默认模型序列化器

来自分类Dev

Django rest 框架 - 模型序列化器不会序列化所有字段

来自分类Dev

如何将绝对URL字段放入Django Rest框架的序列化器模型中?

来自分类Dev

如何获取用户名以显示在序列化器Django Rest框架上

来自分类Dev

DJango REST框架-如何将参数传递给序列化器__init__

来自分类Dev

使用Django REST Framework从主键反序列化相关对象

来自分类Dev

Django rest框架使用FK序列化模型

来自分类Dev

如何对Django rest框架请求进行单元测试?

来自分类Dev

如何对Django Rest Framework序列化器的create方法进行单元测试?

来自分类Dev

使用Django REST框架,如何避免在序列化程序和视图中获取对象?

Related 相关文章

  1. 1

    发布请求Django REST框架

  2. 2

    Django Rest Framework序列化器-返回相关字段

  3. 3

    Django REST框架:在序列化器中获取相关模型的字段

  4. 4

    如何使用Django rest框架反序列化Foreignkey?

  5. 5

    django rest框架序列化相关字段

  6. 6

    如何在django rest框架中将相关字段包括到模型序列化中?

  7. 7

    Django Rest Framework序列化在发布请求时失败

  8. 8

    使用django rest框架的跨站点发布请求

  9. 9

    在使用stream-django和django rest框架进行扩充的过程中,如何序列化对象?

  10. 10

    如何使用Django Rest Framework将url字段添加到序列化器

  11. 11

    如何使用Django Rest Framework序列化器构建JSON响应?

  12. 12

    Django Rest Framework-在序列化器中获取相关模型字段

  13. 13

    Django Rest Framework嵌套的序列化器未显示相关数据

  14. 14

    实例化时Django REST框架序列化器错误

  15. 15

    Django REST框架扁平,可读写序列化器

  16. 16

    在Django Rest框架中修改序列化器的输出

  17. 17

    Mongoengine序列化器错误| Python | Django Rest框架

  18. 18

    django rest框架外键序列化器问题

  19. 19

    实例化时Django REST框架序列化器错误

  20. 20

    django rest 框架 - 全局默认模型序列化器

  21. 21

    Django rest 框架 - 模型序列化器不会序列化所有字段

  22. 22

    如何将绝对URL字段放入Django Rest框架的序列化器模型中?

  23. 23

    如何获取用户名以显示在序列化器Django Rest框架上

  24. 24

    DJango REST框架-如何将参数传递给序列化器__init__

  25. 25

    使用Django REST Framework从主键反序列化相关对象

  26. 26

    Django rest框架使用FK序列化模型

  27. 27

    如何对Django rest框架请求进行单元测试?

  28. 28

    如何对Django Rest Framework序列化器的create方法进行单元测试?

  29. 29

    使用Django REST框架,如何避免在序列化程序和视图中获取对象?

热门标签

归档