首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动内容分发系统

移动内容分发系统
EN

Code Review用户
提问于 2012-02-29 13:24:36
回答 1查看 557关注 0票数 3

为了展示我新获得的Django和Python肌肉,我通过Wap Push (铃声、壁纸等)建立了一个移动内容交付系统。

其想法是,一个关键字来自一个短信通过一个网址,让我们假设关键字是"LOVE1“和程序应该搜索如果这个键盘指向铃声或图像。为此,我创建了一个父模型类,称为“类别”(类别)和两个子类“铃声”和“墙纸”。这个子类有一个名为"archivo“(文件名)的变量,它指向内容的实际路径。

Dynpath是为下载内容而创建的动态URL,因此只能在X时间内使用。之后,芹菜计划的任务将从DB中删除这个动态URL。

我有一个有“代码气味”的片段,我想从这里的每个人那里得到一些输入。

模型

代码语言:javascript
复制
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的存在,这里是代码(工作的)变得可疑/丑陋的地方:

代码语言:javascript
复制
    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

我说的是这段话:

代码语言:javascript
复制
      try:
            fname = str(p.payload.wallpaper.archivo)
        except DoesNotExist:
            fname = str(p.payload.ringtone.archivo)

我很想做这样的事情:

代码语言:javascript
复制
fname = p.payload.archivo

但它不让我这样做,从医生那里:

如果覆盖任何祖先模型中的任何模型字段,Django将引发FieldError。

我看了一看仿制药,但无法使它与他们一起工作。有什么更好的方法吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2012-02-29 20:30:34

您有两个型号(铃声扩展内容)。据我所知,在这两个模型中存储相同的nombrefecha_creacionkeyword以及第一个模型上的每个更新/删除/插入操作都必须与另一个模型同步。您可以避免这种情况,将外键设置为基本模型:

代码语言:javascript
复制
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")

在你看来

代码语言:javascript
复制
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字段中,则解决方案将更容易。

请用英文而不是西班牙文写你的代码)

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/9555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档