2014-12-13 62 views
0

當我更新我的用戶實例時,我無法弄清楚如何創建新的相關對象。 Here'are我的模型:更新一個時創建新的相關對象

class User(AbstractBaseUser, PermissionsMixin): 
    name = models.CharField(max_length=50, verbose_name=_('Name')) 
    email = models.EmailField(max_length=50, unique=True, verbose_name=_('Email')) 

class Weight(models.Model): 
    value = models.FloatField() 
    units = models.IntegerField(choices=UNITS) 
    created = models.DateTimeField(auto_now_add=True) 
    user = models.ForeignKey(User) 

這裏是我的串行:

class UserSerializer(serializers.ModelSerializer): 
    weight = WeightSerializer(source='weight') 

    class Meta: 
     model = User 
     fields = ('name', 'email', 'weight') 

class WeightSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Weight 
     fields = ('value', 'units',) 

下面是實際的觀點:

class UserDetails(APIView): 
    def post(self, request, format=None): 
     user = request.user 
     if user.is_authenticated(): 
      serializer = UserSerializer(user, data=request.DATA, partial=True) 
      if serializer.is_valid(): 
       serializer.save() 
       return Response(serializer.data) 

我需要創建新的重物我每次更新用戶信息時。我怎樣才能做到這一點?當我嘗試做現在,我得到AttributeError: can't set attribute

+0

我看到你正在使用Django REST Framework 2.x,如果可能的話,我建議更新到3.x。 – 2014-12-13 18:53:07

回答

1

在Django REST Framework 3.0中,序列化程序必須顯式處理嵌套更新,這基本上就是你在這裏要做的。您只需要覆蓋perform_update並讓它創建新的Weight對象,而不是手動更新它。

在Django的REST框架2.4,大部分發生這種情況自動將,而你試圖改變這種神奇的行爲。

如果對象上有一個id,那麼Django將對模型對象進行更新,如果id設置爲None,則會進行更新。這意味着您可以通過將id設置爲None來創建對象的基本副本,這是執行您正在查找的最簡單方法。

class UserDetails(APIView): 
    def post(self, request, format=None): 
     user = request.user 
     if user.is_authenticated(): 
      serializer = UserSerializer(user, data=request.DATA, partial=True) 
      if serializer.is_valid(): 
       user.weight.pk = None 
       user.weight.save() 
       serializer.save() 
       return Response(serializer.data) 

這應該會導致每次更新用戶時都會創建一個新的Weight對象。

相關問題