Many-to-many 关系 children 专用于 parent 模型。如何?
Many-to-many relationship children exclusive to parent model. How?
如果有办法更好地表达这个问题的标题,请告诉我。
在 django 中,我试图创建这种模型层次结构:
User
-Author [Author model]
--Sentence [Sentence model]
--Find_Replace [FindReplace model]
某用户设置多个作者为"pen names"。作者有自己的句子和自己预定义的 find/replace 集。一个句子可以与多个 find/replace 集相关联,但只能与该作者创建的句子相关联。
让我感到难过的是:你们是如何建立这样的关系的?
这就是我所拥有的 - 如果不进行程序性修改,我对严格定义这些关系的好方法感到茫然。
以下是迄今为止的模型,仅部分正确:
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,
)
为什么需要作者模型? Author = User, 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()
我不明白为什么每个模型都需要 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 validation or Modelform 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()
如果有办法更好地表达这个问题的标题,请告诉我。
在 django 中,我试图创建这种模型层次结构:
User
-Author [Author model]
--Sentence [Sentence model]
--Find_Replace [FindReplace model]
某用户设置多个作者为"pen names"。作者有自己的句子和自己预定义的 find/replace 集。一个句子可以与多个 find/replace 集相关联,但只能与该作者创建的句子相关联。
让我感到难过的是:你们是如何建立这样的关系的?
这就是我所拥有的 - 如果不进行程序性修改,我对严格定义这些关系的好方法感到茫然。
以下是迄今为止的模型,仅部分正确:
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,
)
为什么需要作者模型? Author = User, 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()
我不明白为什么每个模型都需要 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 validation or Modelform 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()