通过外键(MultipleObjectsReturn)过滤Django rest框架获取请求



我有一个名为Supplier的数据库表,它有一个外键User,每个User都有自己的Supplier。我收到了get请求,它返回了整个表中的所有供应商,但我找不到过滤它的方法,所以我只收到与用户请求关联的供应商。

我通过以下URL访问此请求:http://localhost:8000/pm/getsuppliers/primary-用户密钥/

models.py:

class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
bio = models.CharField(max_length=200)
email = models.CharField(max_length=200)
class Supplier(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
phone = models.IntegerField()
email = models.EmailField(max_length=200)

views.py:

class getsuppliers(viewsets.ModelViewSet):
queryset = Supplier.objects.all()
serializer_class = GetSuppliersSerializer
lookup_field = 'user'

serializers.py:

class GetSuppliersSerializer(serializers.ModelSerializer):
class Meta:
model=Supplier
fields=['pk','user','name','email','phone']

我收到的错误:

ERROR: pm.models.Supplier.MultipleObjectsReturned: get() returned more than one Supplier -- it returned 10!

我已经对此错误进行了一些搜索,他们说在视图中使用.filter而不是.all,但我不确定如何使其返回所请求用户的所有供应商,这似乎只会返回1。也许我错了,希望有人能找到一个简单的解决方案!

您必须将序列化程序的model(在Meta内部(设置为User,并添加一个supplier_set字段:

class GetUserSuppliersSerializer(serializers.ModelSerializer):
supplier_set = SupplierSerializer(read_only=True, many=True)
class Meta:
model = User
fields = ['supplier_set']
class SuppliersSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = ['pk','user','name','email','phone']

并更改视图集查询集以获取用户。

编辑:
要回答评论中的问题,根据您的需要有几种不同的方法,其中一种方法是在GetUserSuppliersSerializer中添加To_representation方法,例如:

def to_representation(self, instance):
response = super().to_representation(instance)
response["supplier_set"] = sorted(response["supplier_set"], key=lambda x: x["pk"])
return response

最新更新