基于Django文档,我应该能够一次传递多个对象以添加到一个多人关系但我得到一个
* TypeError:不可用类型:'list'
当我尝试传递一个列表中的django查询集.传递Queryset或ValuesListQueryset似乎也失败了.有没有比使用for循环更好的方法?
我正在尝试将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项目,所以欢迎任何建议.
有没有一种简单的方法可以在Django Admin中将ManyToManyField显示为Checkbox?有什么建议?
我做了一个模型(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
我有这样的书模型:
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问题,但无法得到明确的答案.任何好的指针也会有所帮助.谢谢.
鉴于这两个模型:
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 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上的查询结果)中放置其他数据,如果可能的话,我试图避免这种情况.
我有以下型号:
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
我有以下型号:
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'
如何使用各自的标签获取"主题"对象并将其传递给模板?
(理想情况下是所有科目.我在这里只做了一个,以简化故障排除过程)
我有一个有效的方法,但它似乎非常笨拙,我认为有更好的方法来做到这一点.
我有一个模型,它将我网站上的用户(用于学习目的的推文克隆)与其他用户列表相关联.
现在,当我创建一个新用户时,我希望将该列表初始化为用户作为列表的成员.
我的模特是:
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()两次,但我似乎无法在文档或其他任何地方找到它.
manytomanyfield ×10
django ×9
django-admin ×3
django-orm ×2
python ×2
foreign-keys ×1
list ×1
many-to-many ×1
migration ×1