django - 从不同的模型字段名称中获取一组对象

     2023-02-24     249

关键词:

【中文标题】django - 从不同的模型字段名称中获取一组对象【英文标题】:django - Get a set of objects from different models field names 【发布时间】:2013-11-21 22:38:11 【问题描述】:

请看看我的模型。

class BackgroundImage(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

class ProfilePicture(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

class Album(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Albums')

    def __unicode__(self):
        return self.name

class Photo(models.Model):
    user = models.ForeignKey(User)
    album = models.ForeignKey(Album, default=3)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

我如何从一组image field 中获取PhotoProfilePictureBackgroundImage 的所有图像。然后通过-pub_date过滤它们以显示在模板中?请帮帮我。将不胜感激!谢谢。

编辑

注意:我需要 ProfilePictureBackgroundImage 才能像这样使用 UserProfile

from django.db import models
from django.contrib.auth.models import User
from profile_picture.models import ProfilePicture
from background_image.models import BackgroundImage

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    permanent_address = models.TextField()
    temporary_address = models.TextField()
    profile_pic = models.ForeignKey(ProfilePicture)
    background_pic = models.ForeignKey(BackgroundImage)

    def __unicode__(self):
        return self.user.username

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

【问题讨论】:

创建基模型类合适吗?用userimagecaptionpub_date 字段说BaseImage(models.Model),然后创建其他模型,如BackgroundImage(BaseImage) 是的,我试过这样。但我不记得为什么,由于某种原因,错误太多。我可以做for循环并从每组中获取图像列表,然后将它们添加在一起吗? 【参考方案1】:

InheritanceManager 作为django-model-utils 的一部分提供,可让您执行此操作,请参阅docs。

在 Linux / Mac 中安装:

sudo pip install django-model-utils

令人讨厌的是,在 Windows 上使用 easy_installpip 安装并不那么简单,请参阅:How do I install Python packages on Windows?。一种快速而肮脏的方法是将django-model-util/ 目录从here 下载到您的django 项目的***目录中,如果您打算将整个项目复制到生产网络服务器上,这很方便。

为了使用InheritanceManager,模型需要稍微重构一下:

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
from model_utils.managers import InheritanceManager

get_upload_file_name = 'images/' # I added this to debug models

class BaseImage(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    objects = InheritanceManager()

class BackgroundImage(BaseImage):
    pass

class ProfilePicture(BaseImage):
    pass

class Album(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Albums')

    def __unicode__(self):
        return self.name

class Photo(BaseImage):
    album = models.ForeignKey(Album, default=3)

所有的 Image 模型现在都继承自一个通用的超类,它创建了一个 InheritanceManager 的实例。我还将所有重复的属性上移到超类中,但这并不是绝对必要的,使用InheritanceManager 意味着在模板中仍然可以访问BaseImage 中不存在的任何属性。

检索按-pubdate排序的列表:

BaseImage.objects.select_subclasses().order_by("-pub_date")

在视图中使用:

def recentImages(request):
    r = BaseImage.objects.select_subclasses().order_by("-pub_date")[:20]
    return  render_to_response("recentImages.html",  "imageList" : r )

在模板中使用:

% for photo in imageList %
  <img src=" photo.image.url " />
% endfor %

这和你要找的一样吗?

编辑

以下代码在新模型中仍然可以正常工作:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    permanent_address = models.TextField()
    temporary_address = models.TextField()
    profile_pic = models.ForeignKey(ProfilePicture)
    background_pic = models.ForeignKey(BackgroundImage)

只需确保ForeignKey 关系中最后两个模型的名称正确!

【讨论】:

非常感谢您的回答。这就是我一直在寻找的。但是还有两个问题。 django-model-utils 是否在 Windows 中工作,因为我尝试了 pip install django-model-utils 但找不到它。其次,我还能在我的UserProfile 模型中使用ProfilePictureBackgroundImage(我在编辑中添加了UserProfile 模型)吗? @Aamu ProfilePicture 和 BackgroundImage 的行为将与以前完全相同。我在答案中添加了一个快速而肮脏的 windows 安装方法,如果这不起作用,还有一个替代答案。 对不起。起初我做的是django-models-utils而不是django-model-utils`。现在它已安装。请您回答我的第二个问题好吗? ProfilePictureBackgroundImage 的行为将与以前完全相同,它们可以在不导入 BaseImage 的情况下导入并用于其他代码段,并且诸如 ProfilePicture.objects.all().orderby("-pubdate") 之类的查询将完全正常工作像之前一样。这根本不应该影响您现有的 UserProfile 代码 - 良好重构的美感,;)。这是否回答了您的第二个问题?如果您想发布UserProfile 代码,我很乐意查看它。 非常感谢您的回答和支持!!!我已将其添加到 Edit 部分。请看一下它并纠正我它是否会起作用。如果我问的问题太多,我真的很抱歉。作为一个新手,我迷失了新概念!

如何从模板标签中的模型对象中获取 django 模型字段值

】如何从模板标签中的模型对象中获取django模型字段值【英文标题】:Howtogetdjangomodelsfieldvaluefrommodelobjectintemplatetags【发布时间】:2011-10-0709:20:53【问题描述】:Models.py:classDiscussion(models.Model):version=models.TextField(blank=True)team=model... 查看详情

Python Django 模板无法从模型函数中获取名称

】PythonDjango模板无法从模型函数中获取名称【英文标题】:PythonDjangoTemplatecannotgetnamefrommodelfunction【发布时间】:2017-02-2713:31:45【问题描述】:虽然我知道我可以从我们的模型中调用函数定义,但我似乎无法提取上传文档的文件... 查看详情

如何从列表中的 django 模型中获取选择字段?

】如何从列表中的django模型中获取选择字段?【英文标题】:Howtogetchoicesfieldfromdjangomodelsinalist?【发布时间】:2021-09-1822:06:32【问题描述】:我有一个具有选择字段的模型。我想获取列表中的选项。请帮助我实现这一目标OPTIONS=((... 查看详情

从 Django QuerySet 中获取所有值以及来自相关模型的其他字段

】从DjangoQuerySet中获取所有值以及来自相关模型的其他字段【英文标题】:GetallvaluesfromDjangoQuerySetplusadditionalfieldsfromarelatedmodel【发布时间】:2019-03-1105:21:39【问题描述】:我想知道是否有捷径可以从Django模型中获取所有字段,并... 查看详情

如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id

】如何使用djangorest框架在模板中获取模型选择字段名称而不是id【英文标题】:HowtogetModelChoiceFieldnameinsteadofidintemplateusingdjangorestframework【发布时间】:2017-01-0420:04:04【问题描述】:我在模板中获得了选择字段的ID。但我希望显示... 查看详情

如何从中间件中的 Django 请求对象获取视图中使用的模型名称?

】如何从中间件中的Django请求对象获取视图中使用的模型名称?【英文标题】:HowtogetmodelnameusedinviewfromaDjangorequestobjectinmiddleware?【发布时间】:2021-04-2420:44:10【问题描述】:我有一个django应用程序,我正在为其编写中间件。在... 查看详情

如何获取 Django 模型中字段的默认值?

】如何获取Django模型中字段的默认值?【英文标题】:HowdoIgetthedefaultvalueforafieldinaDjangomodel?【发布时间】:2010-11-2110:55:01【问题描述】:我有一个Django模型,其中一些字段指定了默认值。我希望稍后在我的代码中为我们获取这些... 查看详情

如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?

】如何从用户在django基本模板中创建的所有帖子中获取模型字段值的总和?【英文标题】:Howtogetthesumofamodelfieldvaluefromallthepostsausercreatedindjangobasetemplate?【发布时间】:2020-10-2514:05:04【问题描述】:我有一个auth_user模型和一个post... 查看详情

从 django 中的一组对象中获取平均值

】从django中的一组对象中获取平均值【英文标题】:getaveragefromsetofobjectsindjango【发布时间】:2011-02-1023:48:14【问题描述】:嘿,我有一个简单的房产评级系统。您给它打分(满分5星)。模型是这样定义的defProperty(models.Model)#stuff... 查看详情

Django 基于类的视图中的字段派生模板名称

】Django基于类的视图中的字段派生模板名称【英文标题】:Field-derivedtemplatenamesinDjangoclass-basedviews【发布时间】:2011-07-3020:30:32【问题描述】:我无法弄清楚如何在Django的新的基于类的视图中从模型的字段名称加载模板。基本上... 查看详情

从两个不同的模型在 Django 中建模收藏夹

】从两个不同的模型在Django中建模收藏夹【英文标题】:ModelingfavoritesinDjangofromtwodifferentmodels【发布时间】:2021-02-1913:30:16【问题描述】:我正在创建一个Netflix克隆应用程序,但我在使用模型时遇到了困难。我有一个Movie模型,... 查看详情

在 django 中获取继承的模型对象

】在django中获取继承的模型对象【英文标题】:Fetchinginheritedmodelobjectsindjango【发布时间】:2011-07-0716:42:34【问题描述】:我有一个具有以下模型的django应用程序:ObjectA是一个从Model扩展而来的简单对象,有几个字段,比方说,... 查看详情

Django:从 HTML 中获取 LIST 数据,无需表单或模型

】Django:从HTML中获取LIST数据,无需表单或模型【英文标题】:Django:GetLISTdatafromHTMLwithoutformsormodels【发布时间】:2018-09-0215:22:43【问题描述】:我有一个包含一系列列表项的HTML页面。我希望能够按下按钮,读取列表中的数据,... 查看详情

Django模板:从模型查询集对象中提取字段

】Django模板:从模型查询集对象中提取字段【英文标题】:Djangotemplate:Extractfieldfrommodelquerysetobject【发布时间】:2016-12-1813:25:30【问题描述】:在Django模板中,我使用以下方法获取最新评论:blog.comments.all|dictsort:"created_at"|last其... 查看详情

为Django中模型的特定字段名称动态创建自定义权限

】为Django中模型的特定字段名称动态创建自定义权限【英文标题】:CreatecustompermissiondynamicallyforspecificfieldnameofamodelinDjango【发布时间】:2021-12-2615:17:08【问题描述】:我创建了一个模型,我想用模型的特定字段名和组名或权限代... 查看详情

模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏

】模型字段类型从CharField更改为ForeignKey时Django模板损坏【英文标题】:DjangoTemplateBrokeWhenModelFieldTypeChangedFromCharFieldtoForeignKey【发布时间】:2021-04-2019:07:20【问题描述】:我有一组模板,它们都以相同的object_list开头。第一个(revie... 查看详情

如何在 Django REST 框架中更改字段名称

】如何在DjangoREST框架中更改字段名称【英文标题】:HowtochangefieldnameinDjangoRESTFramework【发布时间】:2014-05-2209:21:44【问题描述】:我正在尝试更改DRF序列化程序中的模型字段名称,如SQL中的别名。我尝试了不同的方法,但都没有... 查看详情

使用 Form 标签在 Django 模板中获取模型的名称

】使用Form标签在Django模板中获取模型的名称【英文标题】:GettingtheNameoftheModelinaDjangotemplateusingtheFormtag【发布时间】:2016-07-1617:56:10【问题描述】:我想在Django的通用表单模板中显示模型的名称。我考虑过通过表单模板标签访问... 查看详情