【问题标题】:User dependent field as many to many relationship in Django Rest FrameworkDjango Rest Framework中的用户依赖字段多对多关系
【发布时间】:2017-07-08 08:12:44
【问题描述】:

在我的应用程序中,我有一些产品,登录用户应该能够将这些产品标记为收藏夹。

我在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 是只读的,因此不会出现在 @987654326 的验证数据中@方法。

有没有人能解决这个或类似的问题?

【问题讨论】:

    标签: django rest django-rest-framework many-to-many serialization


    【解决方案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
    

    【讨论】:

    • 这就像一个魅力,非常感谢你帮助我!
    • @R.Wenger YW。顺便说一句,您可以调用 favorites.add 和 favorites.remove 而无需额外检查,因为它们是 django 内部制作的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-02-09
    • 2021-06-12
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多