为了展示我新获得的Django和Python肌肉,我通过Wap Push (铃声、壁纸等)建立了一个移动内容交付系统。
其想法是,一个关键字来自一个短信通过一个网址,让我们假设关键字是"LOVE1“和程序应该搜索如果这个键盘指向铃声或图像。为此,我创建了一个父模型类,称为“类别”(类别)和两个子类“铃声”和“墙纸”。这个子类有一个名为"archivo“(文件名)的变量,它指向内容的实际路径。
Dynpath是为下载内容而创建的动态URL,因此只能在X时间内使用。之后,芹菜计划的任务将从DB中删除这个动态URL。
我有一个有“代码气味”的片段,我想从这里的每个人那里得到一些输入。
class Contenido(models.Model):
nombre = models.CharField(max_length=100)
fecha_creacion = models.DateTimeField('fecha creacion')
keyword = models.CharField(max_length=100)
class Ringtone(Contenido):
grupo = models.ManyToManyField(Artista)
archivo = models.FileField(upload_to="uploads")
def __unicode__(self):
return self.nombre
class Wallpaper(Contenido):
categoria = models.ForeignKey(Categoria)
archivo = models.ImageField(upload_to="uploads")
def __unicode__(self):
return self.nombre
class Dynpath(models.Model):
created = models.DateField(auto_now=True)
url_path = models.CharField(max_length=100)
payload = models.ForeignKey(Contenido)
sms = models.ForeignKey(SMS)
def __unicode__(self):
return str(self.url_path)下面是我的观点,它检查动态URL的存在,这里是代码(工作的)变得可疑/丑陋的地方:
def tempurl(request,hash):
p = get_object_or_404(Dynpath, url_path=hash)
try:
fname = str(p.payload.wallpaper.archivo)
except DoesNotExist:
fname = str(p.payload.ringtone.archivo)
fn = open(fname,'rb')
response = HttpResponse(fn.read())
fn.close()
file_name = os.path.basename(fname)
type, encoding = mimetypes.guess_type(file_name)
if type is None:
type = 'application/octet-stream'
response['Content-Type'] = type
response['Content-Disposition'] = ('attachment; filename=%s') % file_name
return response我说的是这段话:
try:
fname = str(p.payload.wallpaper.archivo)
except DoesNotExist:
fname = str(p.payload.ringtone.archivo)我很想做这样的事情:
fname = p.payload.archivo但它不让我这样做,从医生那里:
如果覆盖任何祖先模型中的任何模型字段,Django将引发FieldError。
我看了一看仿制药,但无法使它与他们一起工作。有什么更好的方法吗?
发布于 2012-02-29 20:30:34
您有两个型号(铃声扩展内容)。据我所知,在这两个模型中存储相同的nombre、fecha_creacion、keyword以及第一个模型上的每个更新/删除/插入操作都必须与另一个模型同步。您可以避免这种情况,将外键设置为基本模型:
class Contenido(models.Model):
nombre = models.CharField(max_length=100)
fecha_creacion = models.DateTimeField('fecha creacion')
keyword = models.CharField(max_length=100)
class Ringtone(models.Model):
contenido = models.ForeignKey(Contenido)
grupo = models.ManyToManyField(Artista)
archivo = models.FileField(upload_to="uploads")
class Wallpaper(models.Model):
contenido = models.ForeignKey(Contenido)
categoria = models.ForeignKey(Categoria)
archivo = models.ImageField(upload_to="uploads")在你看来
def tempurl(request,hash):
p = get_object_or_404(Dynpath, url_path=hash)
try:
obj=Wallpaper.objects.get(contenido_id=p.id)
except Wallpaper.DoesNotExist:
try:
obj=Ringtone.objects.get(contenido_id=p.id)
except Ringtone.DoesNotExist:
raise Http404
fname = str(obj.archivo)
# use with statement
with open(fname,'rb') as fn:
response = HttpResponse(fn.read())嗯..。还很复杂吗?如果您可以检索内容类型(铃声或壁纸)并将其保存在Dynpath字段中,则解决方案将更容易。
请用英文而不是西班牙文写你的代码)
https://codereview.stackexchange.com/questions/9555
复制相似问题