【问题标题】:Django Rest Framework update don't save changesDjango Rest Framework 更新不保存更改
【发布时间】:2018-05-09 01:02:28
【问题描述】:

我有两个通过一对一字段关联的模型,我想创建一个REST 服务来管理它们,就像它们在哪里一样。 post 到目前为止运行良好,并且在两个模型中都创建了新实例,但 put 方法什么也不做。它不会引发任何错误或任何事情,只是保持数据不变。

这些是我的模型:

class Company(models.Model):
    name = models.CharField(max_length=40)
    legal_name = models.CharField(max_length=100)
    url = models.URLField()
    address = models.TextField(max_length=400)

    def __str__(self):
        return "[{}]{}".format(self.id, self.name)

class Hotel(models.Model):
    company = models.OneToOneField('Company', on_delete=models.CASCADE, primary_key=True)
    code = models.CharField(max_length=10)
    city = models.ForeignKey('City', on_delete=models.PROTECT, related_name='city_hotels')
    category = models.ForeignKey('HotelCategory', on_delete=models.PROTECT, related_name='category_hotels')
    capacity = models.IntegerField()
    position = models.DecimalField(max_digits=11, decimal_places=2, default=0.00)
    in_pickup = models.BooleanField(default=False)

    def __str__(self):
        return self.company.name

这是我的视图集:

class HotelViewSet(viewsets.ModelViewSet):
    queryset = models.Hotel.objects.all()
    serializer_class = serializers.HotelSerializer

这些是我的序列化程序:

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Company
        fields = ('id', 'name', 'legal_name', 'url', 'address')

class HotelSerializer(serializers.HyperlinkedModelSerializer):
    company = CompanySerializer()
    class Meta:
        model = models.Hotel
        fields = ('company', 'code', 'city', 'category', 'capacity', 'position', 'in_pickup')

    def create(self, validated_data):
        company_data = validated_data.pop('company')
        new_company=models.Company.objects.create(**company_data)
        hotel = models.Hotel.objects.create(company=new_company, **validated_data)

        return hotel

    def update(self, instance, validated_data):

        company = models.Company(
            id=instance.company.id,
            name=instance.company.name,
            legal_name=instance.company.legal_name,
            url=instance.company.url,
            address=instance.company.address
        )

        company.save()
        instance.save()

       return instance

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我发现instance带有原始数据,validated_data带有新数据。我正在保存原始数据。

    我不得不用validated_data 数据替换instance 数据,然后保存instance

    def update(self, instance, validated_data):
    
        company_data = validated_data.pop('company')
        company = models.Company.objects.get(id=instance.company.id)
        company.name = company_data.get('name')
        company.legal_name = company_data.get('legal_name')
        company.tax_id = company_data.get('tax_id')
        company.url = company_data.get('url')
        company.address = company_data.get('address')
    
        instance.company = company
        instance.code = validated_data.get('code', instance.code)
        instance.city = validated_data.get('city', instance.city)
        instance.category = validated_data.get('category', instance.category)
        instance.capacity = validated_data.get('capacity', instance.capacity)
        instance.position = validated_data.get('position', instance.position)
        instance.in_pickup = validated_data.get('in_pickup', instance.in_pickup)
        instance.is_active = validated_data.get('is_active', instance.is_active)
    
        company.save()
        instance.save()
    
        return instance
    

    put 方法现在效果很好。

    【讨论】:

      【解决方案2】:

      您正在创建 company 的新实例,而不是更新属于 Hotel 实例的实例。

      company = Company.objects.get(id=instance.company.id)
      company.name = instance.company.name
      company.legal_name = instance.company.name
      company.url = instance.company.url
      company.address = instance.company.address
      company.save()
      instance.save()
      

      【讨论】:

      • 它不起作用。在put之后数据仍然保持不变
      猜你喜欢
      • 2021-10-06
      • 2020-03-05
      • 2017-04-27
      • 2017-08-15
      • 2015-09-19
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多