2016-07-27 147 views
2

是否可以添加self - 我的意思是当前对象是ManyToManyField默认情况下如何将自我添加到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() 

你知道问题在哪里吗?

+1

如果我了解你,你想要将City'x'作为'close_city'添加到自身? –

+0

是的。 x是城市。我希望x是x.close_cities的一部分 –

+2

如果你想要一个表与自己有多对多的关系,你可能会有错误的设计。 – e4c5

回答

0

在这种情况下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) 
+0

这就是为什么“创建”条件在那里。该代码仅在该对象已被创建而未被保存的情况下执行。此外,pre_save不包含实例,因为它尚未保存在我看来。如果我将其更改为pre_save - 错误正在提出:add_self_into_many_to_many_field()需要3个参数(给出2个) –

+0

'pre_save'接受三个参数:'instance','raw'和'using'。 –

+0

所以它没有“创建”参数,所以我不能只做一次。我认为post_save应该更好如果我是对的,它只执行一次。你不觉得吗?我尝试了您的解决方案,但是出现此错误:例外值:\t “城市:捷克共和国,科希策”需要为字段“from_city”设置一个值,然后才能使用此多对多关系。 –

相关问题