Django заставляет отношения "один-ко-многим" содержать значение True только для одного экземпляра объекта, остальные должны возвращаться к значению False для этого поля

У меня есть следующая модель django:

from django.db import models
from django.db.models import Q, UniqueConstraint
from django.contrib.auth.models import User
import random


class ReferralCode(models.Model):
    code_str = models.CharField(max_length=64,
                                primary_key=True,
                                default="".join(
                                    [chr(random.randrange(48, 123))
                                     for y in range(64)]))
    active = models.BooleanField(default=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        constraints = [
            UniqueConstraint(
                fields=["user", "active"],
                condition=Q(active=True),
                name="unique_active_code_for_user",
            )
        ]

При создании ReferralCode с active=True я хочу, чтобы остальные возвращались к False, как это сделать? Спасибо

если вы хотите, чтобы, когда пользователь создает новый код реферала, он автоматически становился старше active = False, вы можете добиться этого, используя переопределение save() метода.

class ReferralCode(models.Model):
    code_str = models.CharField(
        max_length=64,
        primary_key=True,
        default="".join([chr(random.randrange(48, 123)) for _ in range(64)]),
    )
    active = models.BooleanField(default=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        # If this referral code is being marked as active,
        # deactivate all other codes for the same user
        if self.active:
            ReferralCode.objects.filter(user=self.user, active=True).exclude(
                pk=self.pk
            ).update(active=False)
        super().save(*args, **kwargs)
Вернуться на верх