在Django Rest Framework中,用户相关字段为多对多关系
问题描述:
在我的应用程序中,我有一些产品,登录用户应该能够将这些产品标记为收藏夹。在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中。
有没有人有解决这个或类似的问题?
答
您可以创建自定义字段。
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在内部完成的。 – Raz
不知道,再次感谢! –