У меня есть проект 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