2016-05-10 2 views
0

Я борьба с проблемой извлечения объектов «суб» из списка объектов:Джанго получить «суб» объект из списка объектов

class BusinessLike(models.Model): 
    user = models.ForeignKey(AppUser, related_name='user_business_likes') 
    business = models.ForeignKey(Business, related_name='business_likes') 
    class Meta: 
     unique_together = (('user', 'business'),) 

Как получить 'Business' объект для каждого 'BusinessLike' объекта app_user.user_businesses_likes (без переполнения списка и создания нового списка с business_like.business)?

+0

Что такое 'app_user.user_businesses_likes'? Что вы хотите точно сделать? а можно поподробнее! – DhiaTN

ответ

1

Вы можете использовать values или values_list:

businesses = BusinessLike.objects.values('business') 
businesses = BusinessLike.objects.values_list('business', flat=True) 

Однако, это не даст вам список объектов, вы получите только список внешних ключей идентификаторов.

Django doc около values and value_list.

Если вы хотите, чтобы избежать необходимости дополнительные поиски каждый раз, когда вы делаете business_like.business, вы могли бы использовать select_related:

business_likes = BusinessLike.objects.select_related('business') 

В этом случае, когда вы петли на каждом BusinessLike объекта и сделать business_like.business, Джанго не присоединится база данных больше, но она уже кэширована в памяти.

Django doc about select_related.

+0

Как мне сделать этот список внешних ключей для объектов? –

+0

Вы можете выполнить другой поиск: 'Business.objects.filter (id__in = ids)', но это не эффективно, и мы обычно не делаем этого. Потому что, если у вас есть список 'BusinessLike', это то же самое, что и список« Бизнес », потому что в какой-то момент вам нужно зацикливаться на нем, верно? –

+0

Ну, не совсем так, как я сказал, это не одно и то же, но '__in' должен работать. –

1

Если вы делаете это в представлении, вам может быть проще сделать новый запрос, начиная с модели Business.

businesses = Business.objects.filter(business_likes__user=app_user) 

Я не уверен, что вам нужно создать BusinessLike модель, как это. Вы можете добавить много ко многим полям в модель AppUser (или, если хотите, модель Business).

class AppUser(models.Model): 
    business_likes = models.ManyToManyField(Business) 

Django будет заботиться о создании промежуточной таблицы, а затем вы можете делать запросы, как:

businesses = app_user.business_likes.all() 
Смежные вопросы