Фильтруйте запрос get фреймворка отдыха Django по внешнему ключу (MultipleObjectsReturned)
У меня есть таблица базы данных под названием Supplier, которая имеет внешний ключ User, у каждого пользователя есть свои поставщики. У меня есть запрос get, который возвращает всех поставщиков во всей таблице, но я не могу найти способ отфильтровать его, чтобы я получал только поставщиков, связанных с запрашиваемым пользователем.
Я получаю доступ к этому запросу по этому URL: http://localhost:8000/pm/getsuppliers/primary-key-of-user/
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
class SuppliersSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = ['pk','user','name','email','phone']
А также измените viewset queryset, чтобы получить пользователей