#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")