Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django将默认设置为多个模型字段的子集_Django - Fatal编程技术网

Django将默认设置为多个模型字段的子集

Django将默认设置为多个模型字段的子集,django,Django,我正在努力实现以下行为。添加用户时,至少会将一个项目分配设置为默认值。之后,他们可以通过选项界面将其默认设置为项目分配的任何子集。但我不清楚什么时候可以将外键和多对多字段用作python代码,什么时候不能。我不确定自己是否理解您所说的“我不清楚什么时候可以将外键和多对多字段用作python代码”,但您的伪代码可以进行以下更改: class UserProfile(models.Model): project_assignments = models.ManyToManyField('d

我正在努力实现以下行为。添加用户时,至少会将一个项目分配设置为默认值。之后,他们可以通过选项界面将其默认设置为项目分配的任何子集。但我不清楚什么时候可以将外键和多对多字段用作python代码,什么时候不能。

我不确定自己是否理解您所说的“我不清楚什么时候可以将外键和多对多字段用作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
混淆)


我不确定我是否理解您所说的“我不清楚您何时可以使用外键和多对多字段作为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分配,对吗?谢谢你的时尚提示。