繁体   English   中英

多对多关系孩子是父模型独有的。 怎么样?

[英]Many-to-many relationship children exclusive to parent model. How?

如果有办法更好地表达此问题的标题,请告诉我。

在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, 
        )

我看不到为什么每个模型都需要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, 
        )

关于严格维护规则,您不能在模型结构中定义它。 您可以使用模型验证Modelform验证,也可以在模型中编写自己的函数,如下所示:(例如)

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()

为什么需要作者模型? 作者=用户,django将自动为您创建一个关系

这是我们使用外键的模型:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM