Django ORM проверка строки в базе данных - PullRequest
0 голосов
/ 11 июня 2018

На моем сайте покупатель ищет товар и, найдя его, может связаться с продавцом, нажав на кнопку контакта.Если разговор между этими двумя об этом продукте существует, его следует перенаправить на существующий разговор, иначе мы создадим новый разговор.Таким образом, разговор определяется двумя пользователями и списком.Когда я пытаюсь реализовать логику, я не могу проверить оба условия существования диалога, если список существует ИЛИ пользователи существуют, Джанго возвращает, что диалог существует.Вот мой код:

def create_conversation(request, user_pk1, user_pk2, results_pk):
    user1 = get_object_or_404(get_user_model(), pk=user_pk1)
    user2 = get_object_or_404(get_user_model(), pk=user_pk2)
    results= get_object_or_404(Listing, pk=results_pk)
    existing_conversation = Conversation.objects.filter(users__in=[user1, user2]).filter(listing=results).values_list('id', flat=True)


    if existing_conversation.exists():

        return HttpResponseRedirect(reverse('conversation:conversation_update', kwargs={'pk':existing_conversation[0]}))
    else:
        conv=Conversation()
        conv.save()
        conv.listing = results
        conv.save()
        conv.users.add(*[user1,user2])
        return HttpResponseRedirect(reverse('conversation:conversation_update', kwargs={'pk': conv.pk}))

Вот модель разговора:

class Conversation(models.Model):
    """
    Model to contain different messages between one or more users.

    :users: Users participating in this conversation.
    :archived_by: List of participants, who archived this conversation.
    :notified: List of participants, who have received an email notification.
    :unread_by: List of participants, who haven't read this conversation.]\['
    listing: the listing the conversation is about.
    read_by_all: Date all participants have marked this conversation as read.

    """
    users = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        verbose_name=_('Users'),
        related_name='conversations',
    )
# review the listing before going online, because it is necessary to have a conversation listing
    listing = models.ForeignKey (
        Listing,
        verbose_name=_('Listing'),
        related_name='listing',
        default= 1,
    )

и модель листинга:

Листинг класса (models.Model):

seller = models.ForeignKey(Profile, related_name='seller_listing', verbose_name='sellr', limit_choices_to={'is_seller': True})
    location_Country = models.CharField(max_length=45, verbose_name=_('from_Country'))
    location_State = models.CharField(max_length=45, verbose_name=_('from_State'), null=True, blank=True)
    location_City = models.CharField(max_length=45, verbose_name=_('from_City'))

Я также попробовал разделить его на два условия: a = разговор.объект.филтер (пользователи) и b = разговор.объект.филтер (перечисление), затем используйте если а иb тогда диалог существует, но возникла та же проблема.

и exist_conversation = Conversation.objects.filter (Q (users__in = [user1, user2]) & Q (перечисление = результаты)). values_list ('id', flat = True), но получил ту же проблему.Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать intersection() метод django, добавленный с Django 1.11 , оператор для возврата общих элементов двух или более QuerySets или побитовая операция AND, используемая сзнак `&, чтобы получить то же поведение.

Итак, в вашем случае, проверьте, есть ли пересечение между двумя пользователями с & или intersection()

existing_conversation = (<b>user1.conversations.all() & user2.conversations.all()</b>).filter(listing=results)

# or with django intersection

existing_conversation = (user1.conversations.all()<b>.intersection</b>(user2.conversations.all())).filter(listing=results)

if existing_conversation.exists():
    return HttpResponseRedirect(reverse('conversation:conversation_update', 
       kwargs={'pk':<b>existing_conversation.first().pk</b>}))

 else:
    # rest of the code

БОНУС, я вижу опечатку в вашем коде, вы не отправили pk в качестве аргумента:

kwargs={'pk':<s>existing_conversation[0]</s>}

получите первый экземпляр с first() и получите pk

kwargs={'pk':<b>existing_conversation.first().pk</b>}

или

kwargs={'pk':<b>existing_conversation[0].pk</b>}
...