2015-06-13 29 views
0

如果有更好的方式來表達這個問題的標題,請讓我知道。父母模型獨有的多對多關係兒童。怎麼樣?

在Django我試圖建立這種模型層次:

User 
-Author [Author model] 
--Sentence [Sentence model] 
--Find_Replace [FindReplace model] 

用戶搭建多個作者爲「筆名」。作者有他自己的句子,和他自己預定義的查找/替換集。一個句子可以與多個查找/替換集相關聯,但只能與該作者創建的句子相關聯。

我被困住的事情是這樣的:你如何做出這樣的關係?

下面是我所擁有的 - 沒有程序性修改,我很遺憾保持這些關係的嚴格定義。

下面是模型迄今爲止,只有部分正確的:

class Author(models.Model): 
    created_by = models.ForeignKey(User) 


class FindReplace(models.Model):  
    created_by = models.ForeignKey(User) 
    author = models.ForeignKey(Author)    

    find = models.CharField(max_length=256) 
    replace = models.CharField(max_length=5000) 


class Sentence(models.Model):  
    created_by = models.ForeignKey(User) 
    account = models.ForeignKey(Account) 


    text = models.CharField(
     max_length=500, 
     blank=False, 
     null=False, 
     ) 
+0

是沒有意義的創建作者模型,如果你想在關係中額外使用Field,你應該使用「through」 –

回答

1

我不明白爲什麼你會需要在每個模型created_by場,因爲他們與Author有關,因此與User有關。我會建議像這樣使用:

class Author(models.Model): 
    created_by = models.ForeignKey(User) 


class FindReplace(models.Model):  
    author = models.ForeignKey(Author)    

    find = models.CharField(max_length=256) 
    replace = models.CharField(max_length=5000) 


class Sentence(models.Model):   
    account = models.ForeignKey(Account) #Is account related to user? The you can query it by user. 
    # Or add an FK relation to Author. 


    text = models.CharField(
     max_length=500, 
     blank=False, 
     null=False, 
     ) 

關於嚴格維護規則,您不能在模型結構中定義該規則。您可以使用model validationModelform validation或寫自己的函數模型是這樣的:(例如)

class FindReplace(models.Model):  
     author = models.ForeignKey(Author)    

     find = models.CharField(max_length=256) 
     replace = models.CharField(max_length=5000) 

     def _validate_creation(self, user_id): 
      if self.author.created_by.id == user_id: 
       return True 
      else: 
       return False 

用法: 在views.py:

def someview(request): 
     fr= FindRepace() 
     fr.author = author_obj 
     fr.find = 'Foo' 
     fr.replace = 'Bar' 

     if fr._validate_creation(request.user.id): 
     fr.save() 
0

爲什麼你需要作者的模型?作者=用戶,Django會自動創建一個關係你

0

這裏我們使用外鍵的模式:

class Department(models.Model): 
dept_id = models.CharField(primary_key=True,max_length=20,unique=True) 
dept_name = models.CharField(max_length=20) 
dept_add = models.CharField(max_length=30) 

def _str_(self): 
    return "%s,%s" % (self.dept_id, self.dept_name) 

class Emp_Department(models.Model): 
    emp_no = models.ForeignKey(Employee) 
    dept_id = models.ForeignKey(Department) 
    emp_type = models.CharField(max_length=30) 
    desi_id = models.CharField(max_length=30) 
    join_date = models.DateField() 
    retire_date = models.DateField()