标签: manytomanyfield

如何在Django中一次向ManyToMany关系添加多个对象?

基于Django文档,我应该能够一次传递多个对象以添加到一个多人关系但我得到一个

* TypeError:不可用类型:'list'

当我尝试传递一个列表中的django查询集.传递Queryset或ValuesListQueryset似乎也失败了.有没有比使用for循环更好的方法?

django list manytomanyfield

160
推荐指数
3
解决办法
7万
查看次数

Django迁移错误:您无法更改M2M字段或从M2M字段更改,或在M2M字段上添加或删除

我正在尝试将M2M字段修改为ForeignKey字段.命令validate显示没有问题,当我运行syncdb时:

ValueError: Cannot alter field xxx into yyy they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)
Run Code Online (Sandbox Code Playgroud)

所以我无法进行迁移.

class InstituteStaff(Person):
    user                 = models.OneToOneField(User, blank=True, null=True)
    investigation_area   = models.ManyToManyField(InvestigationArea, blank=True,)
    investigation_group  = models.ManyToManyField(InvestigationGroup, blank=True)
    council_group        = models.ForeignKey(CouncilGroup, null=True, blank=True)
    #profiles            = models.ManyToManyField(Profiles, null = True, blank = True)
    profiles             = models.ForeignKey(Profiles, null = True, blank = True)
Run Code Online (Sandbox Code Playgroud)

这是我的第一个Django项目,所以欢迎任何建议.

migration django foreign-keys manytomanyfield

47
推荐指数
4
解决办法
1万
查看次数

在Django Admin中将ManyToManyField显示为复选框

有没有一种简单的方法可以在Django Admin中将ManyToManyField显示为Checkbox?有什么建议?

python django django-models django-admin manytomanyfield

22
推荐指数
3
解决办法
1万
查看次数

Django Admin ManyToManyField

我做了一个模型(models.py):

class opetest(models.Model):
    name = models.CharField(max_length=200)
    author = models.ForeignKey(User, related_name='author')
    description = models.TextField(u'Test description', help_text = u'Some words about quiz')
    pub_date = models.DateTimeField('date published', blank=False)
    vacancies = models.ManyToManyField(Vacancy, blank=True)
    students = models.ManyToManyField(User, blank=True, related_name='opetests') #This field I want to edit on "User change page"
    estimate = models.IntegerField(default = 0, help_text = u'Estimate time in hours. \'0\' - unlimited')
Run Code Online (Sandbox Code Playgroud)

然后我尝试添加内联块以允许opetest在"更改用户"页面(admin.py)上进行分配:

class ProfileAdmin(UserAdmin):
    filter_horizontal = ('opetests',)

admin.site.unregister(User)
admin.site.register(User, ProfileAdmin)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

'ProfileAdmin.filter_horizontal' refers to field 'opetests' that is missing from model …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm django-admin manytomanyfield

20
推荐指数
1
解决办法
3万
查看次数

Django:ManyToMany过滤器匹配列表中的所有项目

我有这样的书模型:

class Book(models.Model):
    authors = models.ManyToManyField(Author, ...)
    ...
Run Code Online (Sandbox Code Playgroud)

简而言之:

我想检索作者严格等于给定作者集的书籍.我不确定是否有单个查询可以执行此操作,但任何建议都会有所帮助.

长期:

这是我尝试过的(无法运行获取AttributeError)

# A sample set of authors
target_authors = set((author_1, author_2))

# To reduce the search space, 
# first retrieve those books with just 2 authors.
candidate_books = Book.objects.annotate(c=Count('authors')).filter(c=len(target_authors))

final_books = QuerySet()
for author in target_authors:
    temp_books = candidate_books.filter(authors__in=[author])
    final_books = final_books and temp_books
Run Code Online (Sandbox Code Playgroud)

......这就是我得到的:

AttributeError: 'NoneType' object has no attribute '_meta'
Run Code Online (Sandbox Code Playgroud)

一般来说,我应该如何查询模型,其约束条件是其ManyToMany字段包含一组给定的对象,就像我的情况一样?

ps:我发现了一些相关的SO问题,但无法得到明确的答案.任何好的指针也会有所帮助.谢谢.

django django-orm manytomanyfield django-queryset

18
推荐指数
2
解决办法
7594
查看次数

如何基于过滤器删除ManyToMany关系中的多个对象?

鉴于这两个模型:

class Item(models.Model):
    timestamp = models.DateTimeField()

class Source(models.Model):
    items = models.ManyToManyField(Item, related_name="sources")
Run Code Online (Sandbox Code Playgroud)

我可以在给定时间之前找到所有Source的项目:

source.items.filter(timestamp__lte=some_datetime)
Run Code Online (Sandbox Code Playgroud)

如何有效删除与该查询匹配的所有项目?我想我可以尝试这样的事情:

items_to_remove = list(source.items.filter(timestamp__lte=some_datetime))
source.items.remove(*items_to_remove)
Run Code Online (Sandbox Code Playgroud)

但那似乎很糟糕.

请注意,我不想删除这些项目,因为它们也可能属于其他来源.我只想删除他们与特定来源的关系.

django manytomanyfield

16
推荐指数
2
解决办法
9437
查看次数

在Django中,如何在没有显式查询的情况下从多对多关系中的额外字段中检索数据?

鉴于Django 1.0中的情况,您可以在多对多关系中获得额外数据:

class Player(models.Model):
  name = models.CharField(max_length=80)

class Team(models.Model):
  name = models.CharField(max_length=40)
  players = models.ManyToManyField(Player, through='TeamPlayer', related_name='teams')

class TeamPlayer(models.Model):
  player = models.ForeignKey(Player)
  team = models.ForeignKey(Team)
  captain = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

多对多关系允许您使用属性访问相关数据(Team对象上的"players"属性或通过其相关名称使用Player对象上的"teams"属性).当其中一个对象被放置到模板的上下文中时(例如,一个团队放置在一个Context中,用于渲染一个生成Team的名单的模板),可以访问相关对象(即团队中的玩家),但是怎么能额外的数据(例如'队长')可以与来自上下文中对象的相关对象(例如团队)一起访问,而无需在上下文中添加额外的数据?

我知道可以直接查询中间表来获取额外的数据.例如:

TeamPlayer.objects.get(player=790, team=168).captain
Run Code Online (Sandbox Code Playgroud)

要么:

for x in TeamPlayer.objects.filter(team=168):
  if x.captain:
    print "%s (Captain)" % (x.player.name)
  else:
    print x.player.name
Run Code Online (Sandbox Code Playgroud)

然而,直接在中间表上执行此操作需要我在模板的上下文(TeamPlayer上的查询结果)中放置其他数据,如果可能的话,我试图避免这种情况.

python django manytomanyfield

15
推荐指数
1
解决办法
4803
查看次数

Django Admin:多对多列表框没有显示带有参数

我有以下型号:

class Message(models.Model):
    date = models.DateTimeField()
    user = models.ForeignKey(User)    
    thread = models.ForeignKey('self', blank=True, null=True)
    ...

class Forum(models.Model):
    name = models.CharField(max_length=24)
    messages = models.ManyToManyField(Message, through="Message_forum", blank=True, null=True)
    ...

class Message_forum(models.Model):
    message = models.ForeignKey(Message)
    forum = models.ForeignKey(Forum)
    status = models.IntegerField()
    position = models.IntegerField(blank=True, null=True)
    tags = models.ManyToManyField(Tag, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

在管理站点中,当我去添加/更改论坛时,我没有看到您期望的消息列表框.但是,如果我删除ManyToManyField声明中的'through'参数,它会显示出来.那是怎么回事?我已将所有三个模型(加上Tag)注册到admin.py中的管理站点.

TIA

many-to-many django-admin manytomanyfield

13
推荐指数
2
解决办法
9155
查看次数

'QuerySet'对象没有属性ERROR,试图获取ManyToMany字段的相关数据

我有以下型号:

class Tag(models.Model):
    tag_name = models.CharField(max_length=250)
    tagcat = models.ForeignKey('TagCat')

class Subject(models.Model):
    user = models.ManyToManyField(User)
    tags = models.ManyToManyField(Tag)

class TagCat(models.Model):
    cat_name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

所以我有一个主题,有一个标签.我想循环主题及其相应的标签,所以我试图构建正确的视图.到目前为止,我有:

def home(request):
    user1 = Subject.objects.filter(id=1)
    print(user1.tags.all())
Run Code Online (Sandbox Code Playgroud)

我希望通过这个print语句获取用户的标签,但我得到错误

'QuerySet'对象没有属性'tags'

如何使用各自的标签获取"主题"对象并将其传递给模板?

(理想情况下是所有科目.我在这里只做了一个,以简化故障排除过程)

django django-models manytomanyfield

13
推荐指数
1
解决办法
2万
查看次数

在Django中实例化具有manytomany字段的模型实例

我有一个有效的方法,但它似乎非常笨拙,我认为有更好的方法来做到这一点.

我有一个模型,它将我网站上的用户(用于学习目的的推文克隆)与其他用户列表相关联.

现在,当我创建一个新用户时,我希望将该列表初始化为用户作为列表的成员.

我的模特是:

class FollowerList(models.Model)
    follower = models.ForeignKey(User,related_name="follower")
    followed = models.ManyToManyField(User,related_name="followed")
Run Code Online (Sandbox Code Playgroud)

在我看来,我现在正在使用的代码是

user = User.objects.get(username=uname)
flst = FollowerList()
flst.follower = user
flst.save()
flst.followed.add(user)
flst.save()
Run Code Online (Sandbox Code Playgroud)

在我看来应该有一个方法来创建它而不调用save()两次,但我似乎无法在文档或其他任何地方找到它.

django django-models manytomanyfield

12
推荐指数
1
解决办法
5556
查看次数