объект ‘ReverseManyToOneDescriptor’ не имеет атрибута ‘filter’ Django

#python #django #django-related-manager

#python #django #связанный с django-менеджер

Вопрос:

Привет, я пытаюсь извлечь конкретный объект из связанной модели, чтобы отобразить данные в моем представлении, специфичном для этого конкретного объекта, в моем случае у меня есть пользовательская модель пользователя и связанная модель под названием Seller.

Модели

 from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.


class CustomUser(AbstractUser):
    is_customer = models.BooleanField(default=False)
    is_seller = models.BooleanField(default=False)


class Seller(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
    store_name = models.CharField(max_length=120)
    address = models.CharField(max_length=180)
    phone = models.IntegerField(blank=True, null=True)
    email = models.CharField( max_length=180, blank=True, null=True )
    

    def __str__(self):
        return self.store_name

  

Вид

 @method_decorator( seller_required , name='dispatch')
class SellerDashBoardView(ListView):
    model = Seller
    template_name = 'seller_dashboard.html'

    def get_context_data(self, *args, **kwargs):
        user = CustomUser.seller_set.filter(store_name=self.request.user.username)
        context = super(SellerDashBoardView, self).get_context_data( **kwargs)
        context['products'] = Product.objects.filter(seller=user)[:6]
        return context

  

Комментарии:

1. Это не обязательно читать документы docs.djangoproject.com/en/3.1/topics/class-based-views/intro

Ответ №1:

Это потому, что, когда вы хотите отфильтровать ManyToOne обратное отношение, вам нужно выполнить точно такой же запрос, как если бы вы выполняли прямое отношение:

 CustomUser.objects.filter(seller__store_name="Whole Foods") 
# Note that would return a queryset not a single user!
# If you want a CustomUser object you will have to use either get or index the query 
  

Пример документа и пояснения приведены здесь:
https://docs.djangoproject.com/en/3.1/topics/db/examples/many_to_one/

Также лучше использовать метод prefetch_related, чтобы сообщить djano ORM, что ему не нужно выполнять столько запросов, сколько количество связанных объектов, этот запрос должен выполняться в 2 запросах к базе данных вместо длины вашего связанного запроса:

 CustomUser.objects.prefetch_related("seller_set").filter(seller__store_name="Whole Foods")
  

Ссылка на документ:
https://docs.djangoproject.com/en/3.1/ref/models/querysets/#prefetch-related

Вероятно, вы хотели бы использовать ...seller_set.filter , когда у вас уже есть объект CustomUser. Поэтому, если вы хотите отфильтровать его продавцов, вы должны использовать это:

 ...
user.seller_set.filter(store_name="Whole Foods")
  

Это предоставит вам набор запросов объектов продавца, отфильтрованный по названию магазина, относящемуся к конкретному пользователю. В основном тот же запрос, что и этот:

 Seller.objects.filter(user_pk=user.pk, store_name="Whole Foods")