2017-02-18 41 views
2

在我的應用程序中,我有一些產品,登錄用戶應該能夠將這些產品標記爲收藏夾。在Django Rest Framework中,用戶相關字段爲多對多關係

我模仿他們作爲一個多對多的關係在我models.py,像這樣:

class Product(models.Model): 
    product_name = models.CharField(max_length=200) 
    # ... 


    def __unicode__(self): 
     return self.product_name 


class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    favorites = models.ManyToManyField(Product) 

    @receiver(post_save, sender=User) 
    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      Profile.objects.get_or_create(user=instance) 

    @receiver(post_save, sender=User) 
    def save_user_profile(sender, instance, **kwargs): 
     instance.profile.save() 

我想現在什麼實現的是,在產品細節查看用戶可以查看該產品是否是已經是他的最愛,並且應該能夠檢查一個盒子使其成爲他的最愛。

在模型層面上,這是一個多對多的關係,但在視圖上它更像是布爾關係(當前用戶喜歡是/否)。

我已經成功地在細節視圖中顯示的最喜歡的狀態,具有SerializerMethodField

class ProductSerializer(serializers.ModelSerializer): 
    # ... 
    favorite = serializers.SerializerMethodField() 

    def get_favorite(self, obj): 
    try: 
     self.context['request'].user.profile.favorites.get(pk=obj.pk) 
     return True 
    except Product.DoesNotExist: 
     return False 

我正與目前正在添加喜愛的收藏夾當前用戶的列表在此設置掙扎,如此SerializerMethodField是隻讀的,因此,它不會出現在update()方法的validated_data中。

有沒有人有解決這個或類似的問題?

回答

1

您可以創建自定義字段。

class FavoriteField(serializers.BooleanField): 

    def get_attribute(self, instance): 
     return self.context['request'].user.profile.favorites.filter(pk=instance.pk).exists() 

class ProductSerializer(serializers.ModelSerializer): 
    favorite = FavoriteField() 

    def update(self, instance, validated_data): 
     instance = super().update(instance, validated_data) 
     is_favourite = validated_data.get('favorite') # can be None 
     if is_favourite is True: 
      self.context['request'].user.profile.favorites.add(instance) 
     elif is_favourite is False: 
      self.context['request'].user.profile.favorites.remove(instance) 
     return instance 
+0

這工作就像一個魅力,非常感謝你對我的幫助了! –

+1

@ R.Wenger YW。順便說一句,你可以調用'favorites.add'和'favorites.remove'而無需額外的檢查,因爲它們是由django在內部完成的。 – Raz

+0

不知道,再次感謝! –

相關問題