Как сделать уникальным оба варианта? - PullRequest
0 голосов
/ 15 марта 2020

Я создаю модель друга, чтобы сохранить пользователя и его друга. Я использую следующую модель:

class Friend(models.Model):
    user = models.ForeignKey(UserProfile, related_name="user", on_delete=models.CASCADE)
    friends = models.ForeignKey(UserProfile, related_name="friends", on_delete=models.CASCADE)
    accepted = models.NullBooleanField(default=None)

    class Meta:
        unique_together = ('user', 'friends')

В этой модели я могу сохранять ('User1', 'User2'), а также ('User2,' User1 '), что не то, что Я хочу. Итак, как мне сделать это отношение уникальным?

1 Ответ

0 голосов
/ 15 марта 2020

К сожалению, вы не можете.

Я нашел следующее решение в похожей ситуации:


class Friendship(BaseModel):
    sender = models.ForeignKey(to='users.User',
                               on_delete=models.PROTECT,
                               related_name='sent_friendships',
                               verbose_name=_('Sender'))
    receiver = models.ForeignKey(to='users.User',
                                 on_delete=models.PROTECT,
                                 related_name='received_friendships',
                                 verbose_name=_('Receiver'))
    accepted = models.NullBooleanField(_('Accepted'), default=None)
    sender_noticed_result = models.BooleanField(_('Sender noticed result'), default=False,
                                                help_text=_('Shows that sender seen that receiver '
                                                            'accepted/declined the friendship'))

    def __str__(self):
        return f'{self.sender} to {self.receiver}'

    class Meta:
        ordering = ['id']

    def clean(self):
        if (self.__class__.objects
                .filter(Q(sender_id=self.receiver_id, receiver_id=self.sender_id)
                        | Q(sender_id=self.sender_id, receiver_id=self.receiver_id))
                .exclude(id=self.id).exists()):
            raise ValidationError(_(f"Friendship already declared between {self.sender} and {self.receiver}"))
        if self.sender_id == self.receiver_id:
            raise ValidationError(_("Can't declare friendship to yourself"))
        if self.sender_noticed_result and self.accepted is None:
            raise ValidationError(_("Can't notice not yet accepted/declined friendship"))

    def save(self, **kwargs):
        self.full_clean()
        super().save(**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...