2013-04-09 52 views
1

我明白它希望我在我訪問M2M字段之前保存。我不想保存模型。我正在使用稱爲TaskSearchCriteria的模型來搜索任務。用戶可以選擇將標準保存到數據庫以備將來搜索。但應該可以在不保存標準的情況下進行一次搜索。這是我的模型。Django - 實例需要有一個主鍵值才能使用多對多的關係

class TaskSearchCriteria(models.Model): 
    name = models.CharField(max_length=256) 
    task_name = models.CharField(max_length=256, blank=True, null=True) 
    project = models.ForeignKey(Project, blank=True, null=True) 
    sprint = models.ForeignKey(Sprint, blank=True, null=True) 
    type = models.ForeignKey(TaskType, blank=True, null=True) 
    priority = models.ForeignKey(Priority, blank=True, null=True) 
    status = models.ForeignKey(Status, blank=True, null=True) 
    description = models.CharField(max_length=1024, blank=True, null=True) 
    owner = models.ForeignKey(User) 
    users = models.ManyToManyField(User, related_name='a+') 

    def get_param_dict(self): 
     retval = dict() 
     if self.task_name != None and len(self.task_name) > 0: 
      retval["name__contains"] = self.task_name 
     if self.project != None: 
      retval["project__id"] = self.project.pk 
     if self.sprint != None: 
      retval["sprint__id"] = self.sprint.pk 
     if self.type != None: 
      retval["type__id"] = self.type.pk 
     if self.priority != None: 
      retval["priority__id"] = self.priority.pk 
     if self.status != None: 
      retval["status__id"] = self.status.pk 
     if self.description != None and len(self.description) > 0: 
      retval["description__contains"] = self.description 
     if self.users != None and len(self.users) > 0: #**ERROR HERE** 
      ids = [user.pk for user in self.users] 
      retval["users__in"] = ids 
     return retval 

我使用的模型形式創建模型和運行get_param_dict()方法來創建字典用於model.object.filter()。是否可以在不保存數據庫的情況下使用m2m字段?

回答

3

總之,不,你不能在不保存模型的情況下使用m2m字段。

這是爲什麼。你必須記住m2m字段的工作原理。與外鍵不同,m2m關係需要一箇中間表,它有兩個指向另外兩個表的外鍵,因此允許許多行用於任何表(在外鍵中),從而允許多對多的行爲。因此,爲了檢索模型中的users,必須查詢數據庫中的中間m2m表,其中TaskSearchCriteria的外鍵是模型實例的主鍵。只有這樣你才能得到與你的模型相關的用戶列表。但是如果你的模型沒有保存,那是不可能的,因爲你還不能查詢中間表。

但是,您可以提供時不保存在模型實例的解決方法,通過人工提供的用戶列表的get_param_dict方法:

def get_param_dict(self, users=[]): 
    retval = dict() 

    # ... 

    # retreive users from the m2m relation 
    if self.pk: 
     ids = [user_id[0] for user_id in self.users.all().values_list('pk')] 
     if ids: 
      retval["users__in"] = ids 

    # when model is not saved - get user ids from the parameter 
    else: 
     if users: 
      retval["users__in"] = users 

    return retval 
+0

這個工作!謝謝您的幫助。 – 2013-04-10 01:23:11

相關問題