Я пытаюсь создать бэкэнд для социального приложения.При вставке дружеских отношений в базу данных, он также вставляет уже существующие в БД отношения.
Пример: Пользователь 1 и Пользователь 2 уже являются друзьями Итак, строка в БД: 1,2,3, дата Теперь БДбольше не должен принимать один и тот же ряд, но он принимает !!!Как отклонить или ограничить несколько вставок одних и тех же строк.
Мой просмотр:
class Friendship(viewsets.ModelViewSet):
"""Handles Creating Friendship"""
authentication_classes = (TokenAuthentication,)
serializer_class = UserFriendSerializer
permission_classes = (permissions.FriendCreate,IsAuthenticated)
queryset = Friends.objects.all()
def perform_create(self, serializer):
"""Sets the friendship status to user"""
serializer.save(username = self.request.user)
Мой сериализатор:
class UserFriendSerializer(serializers.ModelSerializer):
"""A serializer for adding and removing Friends"""
class Meta:
model = Friends
fields = ('user_id_1','user_id_2','status',)
def create(self, validated_data):
"""Create user friendship with lesser id in first column"""
friend_1 = validated_data['user_id_1']
friend_2 = validated_data['user_id_2']
if friend_1.pk > friend_2.pk:
temp = friend_1
friend_1 = friend_2
friend_2 = temp
friend = Friends(
user_id_1 = friend_1,
user_id_2 = friend_2,
status = validated_data['status'],
)
friend.save()
return friend
Моя модель:
class Friends(models.Model):
'''Friend's or Relationship between user's and their relation status'''
user_id_1 = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user_a')
user_id_2 = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user_b')
status = models.PositiveSmallIntegerField()
friends_on = models.DateTimeField(auto_now_add=True,auto_now=False)
def __str__(self):
"""Returns model as a String"""
return str(self.user_id_1)
class Meta:
verbose_name_plural = "Friends"