Происходит вставка одной строки и как отказаться от вставки, если она уже присутствует в БД Django-rest-framework, PostgreSQL - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь создать бэкэнд для социального приложения.При вставке дружеских отношений в базу данных, он также вставляет уже существующие в БД отношения.

Пример: Пользователь 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"

1 Ответ

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

если я правильно вас понял, вам нужно уникально-вместе

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"
        unique_together = ("user_id_1", "user_id_2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...