我希望我的django应用程序能够提供任何模型字段的列表(这将有助于GUI构建本身).
想象一下这些课程(忽略所有领域Steps都可以进入的事实Item,我有我的理由:-))
class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
class Steps(models.Model):
item = models.OneToOneField('Item', related_name='steps')
design = models.BooleanField(default=False)
prototype = models.BooleanField(default=False)
production = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
现在,当我想列出模型的字段时:
def get_fields(model):
return model._meta.fields + model._meta.many_to_many
Run Code Online (Sandbox Code Playgroud)
但我还想获得我的模型的"相关"一对一外键列表.在我的情况下Item.steps不会在该列表中.
我发现model._meta.get_all_field_names确实包括所有相关领域.
但是当我调用Item._meta.get_field_by_name('steps')它时会返回一个持有a的元组RelatedObject,它不会立即告诉我这是单个关系还是一对多关系(我想仅列出一对一的反向关系).
另外,我可以使用这段代码:
from django.db.models.fields.related import SingleRelatedObjectDescriptor
reversed_f_keys = [attr for attr in Item.__dict__.values() \
if isinstance(attr, SingleRelatedObjectDescriptor)]
Run Code Online (Sandbox Code Playgroud)
但我对此并不十分满意.
欢迎任何帮助,想法,提示!
干杯
我mod_wsgi使用WAMP 在apache上运行django应用程序.
某个URL允许我流式传输图像文件的内容,其路径存储在数据库中.
无论是在本地计算机上还是在网络驱动器(\\my\network\folder)下,都可以找到这些文件.
使用开发服务器(manage.py runserver),我可以毫无困难地阅读和传输文件.
使用WAMP和网络驱动器文件,我得到一个IOError:显然是因为httpd实例没有对所述驱动器的读取权限.
在任务管理器中,我看到httpd.exe由SYSTEM运行.我想告诉WAMP以[我自己]的身份运行服务器,因为我对共享文件夹有读写权限.(最终,生产服务器应由具有权限的'www-admin'用户运行)
映射驱动器号上的网络共享文件夹(例如Z:)根本无法解决此问题.
用户/组指令httpd.conf似乎对Apache的行为没有任何影响.
我还注意到:我试图复制下面的HKLM\[...]\wampapache注册表项HK_CURRENT_USER\并重命名原始密钥,但是当我cmd这个时,似乎找不到新密钥
> httpd.exe -n wampapache -k start
Run Code Online (Sandbox Code Playgroud)
或者当我运行WAMP时.
我已经没想完了:)
有没有人遇到过同样的问题?
注意:由于生产环境的限制,我必须坚持django-1.4到目前为止.
我刚刚做了一个测试,看看当ManyToMany改变时我是否可以挂钩事件.
我有一个Group包含几个Item对象的模型.每当项目在任何组中发生变化时,我都希望对相关的Group`实例做一些事情.
from django.db import models
from django.db.models.signals import m2m_changed, post_delete, pre_delete
class Item(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=32)
items = models.ManyToManyField(to=Item)
def items_changed(signal, sender, action, instance, reverse, model, pk_set, using, **kwargs):
print str(signal)
print action, instance, reverse, pk_set
m2m_changed.connect(items_changed, sender=Group.items.through)
Run Code Online (Sandbox Code Playgroud)
如果我更改实例items上的列表Group,那么m2m_changed事件显然会被触发.
>>> from sandbox.core.models import Group, Item
>>> item, created = Item.objects.get_or_create(name='f')
>>> g = Group.objects.get(pk=1)
>>> g.items.add(item) …Run Code Online (Sandbox Code Playgroud)