Używam Django i chcę używać filtrów

Mój produkt i modele firmy są

class Product(models.Model):
    name = models.CharField(max_length=200)
    companyId = models.ForeignKey(Comapany)

class Company(models.Model):
    domain = models.CharField(max_length=200)

Chcę odzyskać produkty oparte na obecnie firmie użytkownika. Więc wdrożyłem mój widok w ten sposób ..

class ListProducts(APIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

def get(self, request):
        if request.user.is_authenticated():
            userCompanyId = request.user.get_profile().companyId
        products = Product.objects.filter(companyId__id__exact = userCompanyId)
        serializer = ProductSerializer(products)
        return Response(serializer.data)

Moje dane produktu.

{
   "_id": ObjectId("5284ceaae9cfff79368e1f29"),
   "companyId": "528458c4bbe7823947b6d2a3",
   "name": "Apple Juice" 
}
{
   "_id": ObjectId("5267bb4ebbe78220588b4567"),
   "companyId": "52674f02bbe782d5528b4567",
   "name": "Small Soft & Moist Cranberry" 
}

Moje dane firmy

{
   "_id": ObjectId("528458c4bbe7823947b6d2a3"),
   "domain": "Manufacturing" 
}
{
   "_id": ObjectId("52674f02bbe782d5528b4567"),
   "domain": "Manufacturing" 
}

Dostaję wyjście jako []

Problem polega na tym, że podczas studiowania filtrów z Django Doc nie jestem w stanie go zdobyć .. Więc proszę mi pomóż ..

3
Pawan 22 listopad 2013, 14:10

3 odpowiedzi

Najlepsza odpowiedź

Rozwiązałem błąd. W rzeczywistości sposób określania sposobu odniesienia model produktu {X0}} Id Pole modelu firmy było błędne. Więc widziałem, jak userprofile Referencje user Model .I wspominam o moich zmianach.

Model produktu

class Product(models.Model):
    name = models.CharField(max_length=200)
    company = models.ForeignKey(Company,null=True)

Widok

class ListProducts(APIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)
    model = Product

    def get(self, request):
        if request.user.is_authenticated():
            userCompanyId = request.user.get_profile().companyId
        products = Product.objects.filter(company = userCompanyId)
        serializer = ProductSerializer(products,many=True)
        return Response(serializer.data)

Put Company_id w takich danych firmy

{
   "_id": ObjectId("5284ceaae9cfff79368e1f29"),
   "company_id": "528458c4bbe7823947b6d2a3",
   "name": "Apple Juice" 
}
5
Pawan 23 listopad 2013, 14:14

Oczywiście Twój model profilu użytkownika companyId nie jest polem całkowitym, więc należy dostosować model Product, aby mieć kompatybilny typ companyId. Oh i tak: nie masz modelu Company?

0
bruno desthuilliers 22 listopad 2013, 10:23

Ta linia:

ProductSerializer(products)

Powinien być:

ProductSerializer(products, many=True)

W przeciwnym razie jednak twój problem nie jest związany z ramami odpoczynku Django, tylko do konkretnego filtra, który pracujesz, nie zwracając żadnych wyników.

Podwójnie sprawdź, czy request.user.get_profile() zwraca prawidłowy profil, sprawdzić, czy userCompanyId jest ustawiony prawidłowo, a podwójnie sprawdzić liczbę zwrotów zwróconych przez Product.objects.filter(companyId__id__exact=userCompanyId).count().

Zgaduję, że masz nieprawidłowo userCompanyId, albo jest po prostu nie są dowolny pasujący Product rekordy.

0
Tom Christie 22 listopad 2013, 12:36