Вставки из той же строке, что происходит и как отклонить вставку, если ити уже присутствует в БД Джанго-остальное-основы, PostgreSQL

Обновить

April 2019

Просмотры

52 раз

1

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

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

if i understand you correct, you need the unique-together

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")

Связанные вопросы