Django将默认设置为多个模型字段的子集
我正在努力实现以下行为。添加用户时,至少会将一个项目分配设置为默认值。之后,他们可以通过选项界面将其默认设置为项目分配的任何子集。但我不清楚什么时候可以将外键和多对多字段用作python代码,什么时候不能。我不确定自己是否理解您所说的“我不清楚什么时候可以将外键和多对多字段用作python代码”,但您的伪代码可以进行以下更改:Django将默认设置为多个模型字段的子集,django,Django,我正在努力实现以下行为。添加用户时,至少会将一个项目分配设置为默认值。之后,他们可以通过选项界面将其默认设置为项目分配的任何子集。但我不清楚什么时候可以将外键和多对多字段用作python代码,什么时候不能。我不确定自己是否理解您所说的“我不清楚什么时候可以将外键和多对多字段用作python代码”,但您的伪代码可以进行以下更改: class UserProfile(models.Model): project_assignments = models.ManyToManyField('d
class UserProfile(models.Model):
project_assignments = models.ManyToManyField('drawingManager.Project', default=SetDefaultProject(self,default_assignment))
user = models.OneToOneField(User)
default_project
def SetDefaultProject(self,default_assignment):
if default_assignment:
self.default_project = default_assignment
else:
self.default_project = #somehow choose newest project
def __unicode__(self):
admin_reference = self.user.first_name + self.user.last_name
return admin_reference
PS:建议对方法名称使用小写名称和下划线(以免与ClassNameFormatRecommendations
混淆)
我不确定我是否理解您所说的“我不清楚您何时可以使用外键和多对多字段作为python代码”,但您的伪代码将与以下更改一起使用:
class UserProfile(models.Model):
project_assignments = models.ManyToManyField('drawingManager.Project', default=SetDefaultProject(self,default_assignment))
user = models.OneToOneField(User)
default_project
def SetDefaultProject(self,default_assignment):
if default_assignment:
self.default_project = default_assignment
else:
self.default_project = #somehow choose newest project
def __unicode__(self):
admin_reference = self.user.first_name + self.user.last_name
return admin_reference
PS:建议对方法名称使用小写名称和下划线(以免与ClassNameFormatRecommendations
混淆)
如果我理解正确,你就不会理解外键和许多字段返回不同的东西 外键是一种一对多的关系,它指向的一侧是“一”。这意味着,如果将
default\u project
定义为外键,self.default\u project
将返回一个project
实例,您可以将其作为任何其他实例使用和分配
然而,正如名字所暗示的,一个多领域在双方都有“许多”关系。因此,self.project\u assignments
不会返回单个实例,而是返回QuerySet,这是Django处理从数据库检索的实例列表的方式。因此,您可以使用add
和remove
来操作该列表,或者对其进行切片以获得单个实例
例如,如果要将default\u项目
FK设置为项目分配列表中的第一个项目,则可以执行以下操作:
def SetDefaultProject(self,default_assignment):
if default_assignment:
self.project_assignments.add(default_assignment)
else:
self.project_assignments.add(self.project_assignments.latest('id'))
# note: i don't know what your intent is, so please adapt to your needs
# the key here is `MyModel.objects.latest('id')` to retrieve the latest object
# according to the field specified. 'id', 'date_created', etc.
(虽然在实际代码中,您必须防止没有赋值的可能性,这样会引起索引器)。如果我理解正确,您就不会理解foreignkey和许多字段返回不同的内容 外键是一种一对多的关系,它指向的一侧是“一”。这意味着,如果将
default\u project
定义为外键,self.default\u project
将返回一个project
实例,您可以将其作为任何其他实例使用和分配
然而,正如名字所暗示的,一个多领域在双方都有“许多”关系。因此,self.project\u assignments
不会返回单个实例,而是返回QuerySet,这是Django处理从数据库检索的实例列表的方式。因此,您可以使用add
和remove
来操作该列表,或者对其进行切片以获得单个实例
例如,如果要将default\u项目
FK设置为项目分配列表中的第一个项目,则可以执行以下操作:
def SetDefaultProject(self,default_assignment):
if default_assignment:
self.project_assignments.add(default_assignment)
else:
self.project_assignments.add(self.project_assignments.latest('id'))
# note: i don't know what your intent is, so please adapt to your needs
# the key here is `MyModel.objects.latest('id')` to retrieve the latest object
# according to the field specified. 'id', 'date_created', etc.
(虽然在实际代码中,您必须防止没有赋值的可能性,这样会引起索引器)。谢谢,这是我的困惑。我没有意识到多对多字段返回的查询集。因此,我可以执行self.default\u project=self.project\u assignments.order\u by(-date\u added)[0]之类的操作,前提是该项目添加了一个名为date\u的字段以获取最近的项目。谢谢,这是我的困惑。我没有意识到多对多字段返回的查询集。因此,我可以执行类似self.default\u project=self.project\u assignments.order\u by(-date\u added)[0]的操作,假设项目中添加了一个名为date\u的字段以获取最近的项目。如果我使用此代码,它将添加为新的项目\u assignment default\u assignment,对吗?谢谢你的风格提示。如果我使用这段代码,它会添加为一个新的项目\u分配默认\u分配,对吗?谢谢你的时尚提示。