【问题标题】:How to add self to ManyToManyField by default?默认情况下如何将self添加到ManyToManyField?
【发布时间】:2016-12-01 17:06:56
【问题描述】:

是否可以添加self - 我的意思是当前对象是ManyToManyField

class City(models.Model):
    name = models.CharField(max_length=80)
    country = models.ForeignKey('Country')
    close_cities = models.ManyToManyField('City',blank=True, related_name='close_cities_set')

如果我创建假设x = City.objects.create(...),我希望x 默认成为close_cities 的一部分。

我找不到与此问题相关的任何内容。我试图覆盖create() 方法,但没有成功。

经过尝试,我决定创建一个信号,在创建实例后添加城市。不幸的是,这不起作用,但我不知道为什么。正在调用信号,条件if createdTrue(选中)。

@receiver(post_save,sender=myapp_models.City)
def add_self_into_many_to_many_field(sender, instance, created, **kwargs):
    if created:
        instance.close_cities.add(instance)
        instance.save()

你知道问题出在哪里吗?

【问题讨论】:

  • 如果我理解你的话,你想将 City x 添加到自身作为 close_city
  • 是的。 x 是城市。我希望 x 成为 x.close_cities 的一部分
  • 如果您希望一个表与其自身具有多对多关系,那么您可能的设计是错误的。
  • 如果您添加一个名为 close_citiesproperty 并返回您的字段中的内容以及对象本身,该怎么办?
  • 你试过close_cities = models.ManyToManyField("self")吗?

标签: python django django-models django-signals


【解决方案1】:

在这种情况下pre_save 信号将是更好的解决方案。

在您的解决方案中city.save 调用add_self_into_many_to_many_fieldinstance.save 致电 add_self_into_many_to_many_field。等等……

@receiver(pre_save, sender=myapp_models.City)
def add_self_into_many_to_many_field(sender, instance, **kwargs):
    if instance.pk is None:
        instance.close_cities.add(instance)

【讨论】:

  • 这就是“创建”条件存在的原因。仅当对象已创建而不是保存时才执行代码。此外, pre_save 不包含实例,因为我认为它尚未保存。如果我将其更改为 pre_save - 将引发错误: add_self_into_many_to_many_field() 恰好需要 3 个参数(给定 2 个)
  • pre_save 接受三个参数:instancerawusing
  • 所以它没有“created”参数,所以我不能只做一次。我认为 post_save 应该更好如果我是对的,它只执行一次。你不觉得吗?我尝试了您的解决方案,但出现了此错误:异常值:“”需要为字段“from_city”设置一个值,然后才能使用这种多对多关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多