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)