Недавно я пытался что-то с этим сделать. Думайте о семье как о группе в Facebook.
class Family(models.Model):
name = models.CharField(max_length=50)
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='owned_families')
users = models.ManyToManyField(User, related_name='families', blank=True)
давайте предположим, что у нас есть этот семейный объект с именем fm
, для иллюстрации.
Моя проблема в том, что owner
- это один users
верно? Я имею в виду, когда кто-то создает семью, он теперь владелец, верно? он владеет им, но он все еще пользователь, указанный в его списке пользователей. Теперь, когда я создаю новое семейство fm
, я хочу добавить fm.owner
к fm.users
.
Давайте поговорим о том, что я пробовал.
post_save
сигнал не работает с м2. X
m2m_changed
происходит, когда поле изменено, но не создано. X
- Переопределяющий
save
метод, позвольте мне показать, что я пытался достичь. ?
def save(self, *args, **kwargs):
old = self.pk
super(Family, self).save(*args, **kwargs)
if old is None:
print('This actually shows up')
self.users.add(self.owner)
По сути, это сохраняет ПК каждый раз, когда создается первое семейство, Перед вызовом super.....
у него нет .pk
так что я рассчитываю на это, чтобы проверить, не было ли у него pk (при создании).
Проблема в self.users.add(self.owner)
не работает.
Я пытался клонировать объект в целом и отслеживать его, как
def save(self, *args, **kwargs):
old = self
super(Family, self).save(*args, **kwargs)
if old is None:
print("This actually doesn't show up")
self.users.add(self.owner)
Это на самом деле ужасно, требуется обращение к себе и при вызове super....
, self
и его ссылка old
видоизменяется, я просто хотел показать это, поскольку сам этот вопрос может решить чью-то проблему.
Так что я решил это с помощью.
import copy
def save(self, *args, **kwargs):
old = copy.deepcopy(self)
super(Family, self).save(*args, **kwargs)
if old is None:
print('This actually shows up')
self.users.add(self.owner)
, но self.users.add(self.owner)
все еще не работа.
Чего мне не хватает?