Можно ли искать два поля, одно из которых передается в рамках отдыха django

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

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

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

сейчас он проверяет друзей ... я хочу, чтобы проверить друзей и friender.username

вот мой код:

модели:

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 ответа


Вы можете сделать это с помощью простого ИЛИ 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')

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

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


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

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

http://example.com/api/end/point/?search=russell

Есть идеи?

10000