2016-07-27 33 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」設置一個值,然後才能使用此多對多關係。 –