我一直致力于在Django中开发一些RESTful服务,以便与Flash和Android应用程序一起使用.
开发服务接口非常简单,但我遇到了序列化具有外键和多对多关系的对象的问题.
我有这样的模型:
class Artifact( models.Model ):
name = models.CharField( max_length = 255 )
year_of_origin = models.IntegerField( max_length = 4, blank = True, null = True )
object_type = models.ForeignKey( ObjectType, blank = True, null = True )
individual = models.ForeignKey( Individual, blank = True, null = True )
notes = models.TextField( blank = True, null = True )
Run Code Online (Sandbox Code Playgroud)
然后我将使用这样的模型执行查询select_related(),以确保遵循外键关系:
artifact = Artifact.objects.select_related().get(pk=pk)
Run Code Online (Sandbox Code Playgroud)
一旦我拥有了该对象,我将其序列化,并将其传递回我的视图:
serializers.serialize( "json", [ artifact ] )
Run Code Online (Sandbox Code Playgroud)
这就是我得到的,请注意外键(object_type和individual)只是其相关对象的id.
[
{
pk: 1
model: "artifacts.artifact"
fields: …Run Code Online (Sandbox Code Playgroud) 我在Django中遇到了PIL(Python图像库)的一个主要问题,并且已经跳过很多环节,到目前为止还没能弄清楚问题的根源是什么.
问题基本上分解为无法通过Django管理员中的ImageField上传JPEG图像.但问题并不像安装libjpeg那么简单.
首先,我安装了PIL(通过Buildout)并在安装后意识到我没有安装libjpeg,因为JPEG支持不可用.
没有自己设置服务器,我只是假设它没有安装,我从源代码编译了libjpeg 8.这最终出现在我的/ usr/local/lib /目录中.我清除了我的Buildout文件并重建了所有内容.这次PIL编译时我有JPEG支持.但我去了Django Admin并尝试通过ImageField上传JPEG而没有运气.我收到了"上传有效图片.您上传的文件不是图片或损坏的图片"错误.就像测试一样,我打开了一个Djano shell并执行以下操作:
> import Image
> i = Image.open( "/absolute_path/file.jpg" )
> print i
<JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>
Run Code Online (Sandbox Code Playgroud)
这样运行没有错误,并显示PIL能够打开JPEG.
在做了一些阅读之后,我遇到了这个帖子: 是否可以控制apache使用哪些库?
看起来PHP也使用libjpeg并在Django之前加载,因此之前加载libjpeg 6.2.这是在使用lsof时显示的:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 2561 www-data mem REG 202,1 146032 639276 /usr/lib/libjpeg.so.62.0.0
Run Code Online (Sandbox Code Playgroud)
所以我的想法是我应该使用libjpeg 6.2.所以我删除了位于/ usr/local/lib目录下的libjpeg .重新阅读PIL安装说明后,我意识到我可能没有PIL需要的libjpeg的dev/header文件.所以我也使用aptitude uninstaller(sudo aptitude remove libjpeg62)卸载了libjpeg .然后为了确保我得到了PIL需要的头文件,我使用aptitude安装了libjpeg:(sudo aptget install libjpeg62-dev).
从这里我清理了我的Buildout目录,然后重新构建Buildout,然后重新安装PIL.我再次获得JPEG支持,现在使用libjpeg62.
所以我去Django Admin进行测试.仍然没有JPEG支持.所以我想测试一般的JPEG支持,看看是否没有处理异常,它会抛出什么样的错误.所以在我的主页视图中,我添加了以下代码来打开JPEG图像:
import Image
i = Image.open( …Run Code Online (Sandbox Code Playgroud)