【问题标题】:django social media apps ManyToManyField population issuedjango 社交媒体应用程序 ManyToManyField 人口问题
【发布时间】:2019-09-30 16:38:12
【问题描述】:

我正在用 django 编写一个社交媒体应用程序。我设计了一个模型,但是当我尝试填充它时,它会抛出这个错误:

ValueError at /admin/social/group/add/

"<Group: Group object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.

这些是我的模型:

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=20)


class Group(models.Model):
    admin = models.ForeignKey(
        Person, 
        on_delete=models.CASCADE,
        related_name='group_admin'
    )
    members = models.ManyToManyField(
        Person, 
        related_name='group_members',
        blank=True
    )

    def save(self, *args, **kwargs):
        self.members.add(self.admin)
        super(Group, self).save(*args, **kwargs)

我希望admin 也成为group 成员。

当我像这样保持save 方法时...

def save(self, *args, **kwargs):
    super(Group, self).save(*args, **kwargs)
    self.members.add(self.admin)

...它不会引发任何错误,但成员字段也不会按预期填充。

我想在创建Group 期间提交管理员时实现这一点,成员字段将自动填充与管理员相同的外键。

我的意思是,admin 将在同一组的members 中。

谁能帮我实现这个目标?

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    覆盖模型的save 方法可能很棘手,而且通常不是解决给定挑战的最佳解决方案。

    您可以尝试的另一种方法是post_save signal(尽管信号也有争议!)。

    它在您的 models.py 中可能看起来像这样:

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    
    class Group(models.Model):
        admin = ...
        members = ...
    
    
    @receiver(post_save, sender=Group)
    def add_admin_to_members(sender, instance, created, **kwargs):
        """
        adds self.admin to self.members when Group is created
        """
    
        if created and instance.admin:
            instance.members.add(instance.admin)
    
    

    当您在其他地方创建带有adminGroup 时...

    Group.objects.create(admin=SomeUser)
    

    ...,add_admin_to_members函数将被执行,因为它连接到Group模型的post_save信号。

    编辑

    检查this repository 以演示答案中描述的内容。特别检查test case

    【讨论】:

    • 我知道我可以通过信号来实现,但我想通过保存方法来实现
    • 不管怎样,也不能通过信号来实现,你有没有像你描述的那样自己尝试过?
    • 分析器有一个小错误。它应该是 instance.admin 而不是 self.admin。已更正。有关概念证明,请参阅 this repo
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2016-08-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多