我的一个模型中有问题.我正在上传一个图片,我想存储id(数据库表中的pk),但我需要知道Django可以访问哪个点 self.id
.
models.py
class BicycleAdItemKind(MPTTModel):
def url(self, filename):
pdb.set_trace()
url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename)
return url
def item_kind_image(self):
return '<img align="middle" src="/media/%s" height="60px" />' % self.image
item_kind_image.allow_tags = True
# Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista
n_item_kind = models.CharField(max_length=50)
parent = TreeForeignKey('self', null=True,
blank=True, related_name='children')
description = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to=url, null=True, blank=True)
date_inserted = models.DateTimeField(auto_now_add=True)
date_last_update = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.n_item_kind
class MPTTMeta:
order_insertion_by = ['n_item_kind']
Run Code Online (Sandbox Code Playgroud)
问题出在url()
方法上; 我只能self.id
在更新对象时得到,我self.id …
我正在使用Django开发一个博客网站.我的网站将允许用户评论我的任何博客文章,并相互回复,并将使用"线程评论"结构显示(我还没有启动用户功能,只是评论).我已经使用django-mptt(至少,现在)使用线程注释正常工作,但如果我正在采取的路线或步骤方向正确,我没有CLUE.几乎所有我经历过的教程只涉及到评论的表面,而不是在django中讨论线程评论.我想要一些经验丰富/专业的建议,告诉我可能做错了什么,以及我可以做得更好.我想要的最后一件事就是在经过数小时的工作后发现有一种更可接受的方式.
所以,这里列出了我需要明确的内容:
Django的MPTT:
一个html页面上有多个表单
对不起,如果这些是菜鸟问题,我的帖子就这么久了.我只想用最好的方法为初学者使用现实的解决方案.任何反馈都会有帮助.谢谢!这是我的博客应用程序的代码.
models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
class Post(models.Model):
"""Blog post"""
title = models.CharField(max_length=200)
body = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.body[:50] + '...'
class Comment(MPTTModel):
"""User comment"""
post = models.ForeignKey(Post, related_name='comments',on_delete=models.CASCADE)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children',db_index=True, on_delete=models.CASCADE)
user_comment = models.CharField(max_length=500, unique=True)
date_added = models.DateTimeField(auto_now_add=True)
# approved = models.BooleanField(default=False)
class MPTTMeta:
order_insertion_by = ['date_added']
def __str__(self):
return self.user_comment[:20]
Run Code Online (Sandbox Code Playgroud)
"已批准"已被注释掉,因为出于某种奇怪的原因我得到了"没有这样的列:已批准"错误.
forms.py
from django …
Run Code Online (Sandbox Code Playgroud) 我正在使用django-mptt 0.4.2,并希望重建一棵树.
树管理器有一个方法rebuild(),我试图像这样访问:
>>> my_rootnode = MyObj.objects.get(id=12)
>>> my_rootnode.tree.rebuild()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 211, in __get__
raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
AttributeError: Manager isn't accessible via MyObj instances
Run Code Online (Sandbox Code Playgroud)
我显然做错了.我该如何访问重建方法?
有没有人有一个有效的算法来检索一个mptt查询集的所有祖先?到目前为止我能想到的最好的是这样的:
def qs_ancestors(queryset):
if isinstance(queryset, EmptyQuerySet):
return queryset
queryset_aggs = queryset.values_list('tree_id', 'level').annotate(max_lft=Max('lft'), min_rght=Min('rght'))
new_queryset = queryset.none()
for tree_id, level, max_lft, min_rght in queryset_aggs:
ancestors = MyModel.objects.filter(
tree_id=tree_id,
level__lt=level,
lft__lte=max_lft,
rght__gte=min_rght,
)
new_queryset = ancestors | new_queryset
return new_queryset
Run Code Online (Sandbox Code Playgroud)
这种方法存在两个问题:
number_of_trees*number_of_levels
在最终查询中有条款,它可以非常快地变得非常大我愿意在其他地方缓存祖先,但我想不出有效的方法.我考虑添加一个字段,用逗号分隔的祖先id的列表,然后GROUP_CONCAT
在一个额外的内部做一个(我在MySQL中),但我认为这可能会变得很大/很慢.
我的Django的应用程序有一个requirements.txt文件(如图所示这里),我用我的虚拟环境中安装的模块.一切正常.
但是,我现在正在尝试将django-mptt从0.6.1升级到最新版本.(其实我不在乎升级Django的MPTT.我只是想升级版本的Django的,但它似乎升级Django的,所描述的我必须先升级Django的MPTT 这里).所以我这样做pip install -U django-mptt
.这导致django-mptt从0.6.1变为0.7.4,Django从1.7.1变为1.8.2.它还会导致django-cache-machine从origin到master.您可以在下面的屏幕截图中看到更改.
然后当我这样做manage.py runserver
然后提示我迁移.所以我这样做.没问题.但是随后如果我删除所有表然后再次运行迁移,我在迁移期间会收到此错误:
django.db.utils.OperationalError:
(1005, 'Can\'t create table `mydb_instance`.`#sql-21b_1e`
(errno: 150 "Foreign key constraint is incorrectly formed")')
Run Code Online (Sandbox Code Playgroud)
完整堆栈跟踪在这里.
这个错误是什么?是否与我使用MariaDB(服务器版本:10.0.15-MariaDB Homebrew)而不是MySQL作为我的数据库这一事实有关?
编辑:以下部分该点已于2015年7月6日5:28 UTC添加
我在上面提到过,升级后,我被提示进行迁移.奇怪的是,即使升级MPTT不会导致创建任何新的迁移文件,也会发生这种情况!当我这样做时manage.py runserver
,我收到了以下警告信息.为什么?这没有道理:
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
Run Code Online (Sandbox Code Playgroud)
编辑:以下部分该部分已于2015年7月6日17:00 UTC加入
作为实验,我将基础数据库从MariaDB切换到MySQL(服务器版本:5.6.25).问题依然存在.我得到的错误是Cannot add foreign key constraint
.完整的堆栈跟踪在这里.
编辑:这个点以下这个点在2015年7月6日在17:05 UTC上添加
通过我在5分钟前发布的堆栈跟踪,我发现错误是由以下SQL语句触发的:
ALTER TABLE `myapp2_mymodel2` ADD CONSTRAINT …
Run Code Online (Sandbox Code Playgroud) 我是Django和MPTT的新手,并且很难弄清楚如何获取所有叶子节点并将它们直接发送到Form类.例如,我创建了MPTT类别模型,并具有以下层次结构:
所以我只想获得叶子类别(cat2,3,5,6).我的Form类看起来像这样:
class UploadForm(forms.Form):
description = forms.CharField(max_length=50)
category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.all())
file = forms.FileField()
Run Code Online (Sandbox Code Playgroud)
并且使用queryset = Category.objects.all()我得到完全相同的东西 - 所有类别及其子节点.有一种方法我只能得到叶节点(子节点),但所有类别的叶子节点,而不是特定的类别实例?谢谢.
我试图用django-mppt获取Django上给定节点的所有子节点的对象
我有一个如下所示设计的模型,具有相同缩进级别的类/类别(节点)定义兄弟,内部缩进是子.标有类别的对象显示在类别(节点)下方.对象以-
符号开头.类/类别(节点)中的数字是ids.
所有节点都是Category
具有id
给定的类的实例.
high school (1)
class 8 (2)
division a (3)
-Billie
-Tre
-Mike
division b (4)
-Patrik
-Pete
-Andy
class 9 (3)
division a (8)
-Mark
-Tom
-Travis
division b (5)
-Gerard
-Frank
-Mikey
class 10 (4)
division a (6)
-Hayley
-Jeremy
-Taylor
division b (7)
-Steven
-Slash
-Izzy
Run Code Online (Sandbox Code Playgroud)
我可以通过这种方式获取特定节点的查询集,
>>> Category.objects.get(pk=7).product_set.all()
[Steven, Slash, Izzy]
>>> Category.objects.get(pk=4).product_set.all()
[Mark, Tom, Travis]
Run Code Online (Sandbox Code Playgroud)
我怎样查询pk=1
,pk=2
,pk=3
或pk=4
让所有的子对象?
例,
查询的pk=2 …
我想使用JavaScript InfoVis Tooljit(http://thejit.org)在django中渲染一个mptt节点的树.如何在django中创建所需的json结构(请参阅http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html以获取示例)?
谢谢
在这个问题上,我一直在桌子上撞了几个星期,所以我觉得可能是时候寻求帮助了.
我正在尝试实现一个数据库结构,它具有程序集部件的分层数据.我的主要问题在于尝试将一个"子组件"分配给另一个"组件"/树.参考下面的示例树 - 我在创建和使用程序集1和2时没有任何问题.但是当我进行程序集3时,当我调用子程序集时,我得到多个对象返回错误(我根据我的方式理解)尝试).
assembly 1: assembly 2: assembly 3:
1.1 2.1 2.1
- 1.1.1 - 2.1.1 - 2.1.1
1.2 2.2 1.2
- 1.2.1 - 2.2.1 - 1.2.1
Run Code Online (Sandbox Code Playgroud)
这是我一直在尝试的模型:
#models.py snippet
class Part(models.Model):
part_name = models.CharField(max_length=30, primary_key=True)
description = models.TextField(max_length=500, blank=True, null=True)
revision = models.CharField(max_length=10, blank=True, null=True)
def __unicode__(self):
return u'%s' % (self.part_name)
class Assembly(MPTTModel):
name = models.ForeignKey(Part)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
def __unicode__(self):
return u'%s' % (self.name)
#views.py snippet
def assembly_details(request, assembly_name):
context_instance=RequestContext(request)
assembly = Assembly.objects.get(name=assembly_name)
descendants_list …
Run Code Online (Sandbox Code Playgroud) 我正在为我的评论应用程序使用django-mptt包,我有以下模型:
class Comment(MPTTModel):
content = models.TextField(verbose_name='Tre??')
author = models.ForeignKey(AUTH_USER_MODEL, verbose_name='Autor', blank=False, null=True)
is_deleted = models.BooleanField(verbose_name='Komentarz usuni?ty', default=False,
help_text='Zaznacz, aby usun?? komentarz')
ip = models.GenericIPAddressField(default=0, verbose_name='Adres IP')
content_type = models.ForeignKey(ContentType, verbose_name='Typ obiektu')
object_id = models.PositiveIntegerField(verbose_name='ID obiektu')
content_object = GenericForeignKey('content_type', 'object_id')
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
hotness = models.FloatField(default=0)
created_at = models.DateTimeField(auto_now_add=False, verbose_name='Data dodania')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Aktualizacja')
class MPTTMeta:
order_insertion_by = ('-hotness', '-created_at')
class Meta:
verbose_name = 'Komentarz'
verbose_name_plural = 'Komentarze'
def __unicode__(self):
if len(self.content) > 50:
return self.content[:50] …
Run Code Online (Sandbox Code Playgroud)