Можно ли искать два поля, одно из которых передается в рамках отдыха django - PullRequest
2 голосов
/ 16 мая 2019

У меня есть проект Django Rest Framework. У меня есть знакомые модели, у которых есть подружка и подружка. friender - это внешний ключ для пользователя, который содержит имя пользователя, а friended - поле char, которое будет именем пользователя.

У меня есть имя пользователя, переданное через URL, который вызывает сериализацию. Я хочу, чтобы он использовался для поиска по обоим полям и определения наличия в записях имени пользователя friender и friended.

Было бы лучше установить оба поля в качестве charfields и хранить имена пользователей в обоих или есть простой способ поиска обоих полей и объединения результатов ...

сейчас он проверяет друзей ... я хочу проверить друзей и имя пользователя

вот мой код:

Модель:

class Friend(models.Model):
    friender = models.ForeignKey(User, on_delete=models.CASCADE)
    friended = models.CharField(max_length=50)
    status = models.SmallIntegerField()
    blocked = models.BooleanField(default=False)
    favorite = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.friender.username + self.friended

сериализатору:

class FriendSerializer(serializers.ModelSerializer):
    class Meta:
        model = Friend
        fields = (
            'friender',
            'friended',
            'status',
            'blocked',
            'favorite',
        )
        depth=2

вид:

from users.models import Friend
from ..serializers import FriendSerializer
from rest_framework import viewsets

class FriendViewSet(viewsets.ModelViewSet):
    queryset = Friend.objects.all()
    lookup_field = 'friended'
    serializer_class = FriendSerializer

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Вы можете сделать это с помощью простого ИЛИ queryset.Тем не менее, оба поля должны быть в одном и том же формате.Итак, выберите либо ForeignKey, либо CharField.Я бы порекомендовал ForeignKey, и вам нужно было бы просто добавить атрибут related_name для обоих, чтобы избежать конфликтов.Что-то похожее на приведенное ниже.

friender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='friender_user_id')
friended = models.ForeignKey(User, on_delete=models.CASCADE, related_name='friended_user_id')

для набора запросов потребуется импорт Q:

from django.db.models import Q
Friend.objects.filter(Q(friender__name__iexact='John Doe') | Q(friended__name__iexact='John Doe')
1 голос
/ 16 мая 2019

В соответствии со структурой вашей модели, вы можете использовать DRF SearchFilter в этом контексте.

from users.models import Friend
from ..serializers import FriendSerializer
from rest_framework import viewsets
<b>from rest_framework import filters</b>


class FriendViewSet(viewsets.ModelViewSet):
    queryset = Friend.objects.all()
    lookup_field = 'friended'
    serializer_class = FriendSerializer
<b>    filter_backends = (filters.SearchFilter,)
    search_fields = ('friended', 'friender__username')</b>

Тогда поисковый URL будет, как,

http://example.com/api/end/point/<b>?search=russell</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...