关键词:
【中文标题】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
中获取Photo
、ProfilePicture
和BackgroundImage
的所有图像。然后通过-pub_date
过滤它们以显示在模板中?请帮帮我。将不胜感激!谢谢。
编辑
注意:我需要 ProfilePicture
和 BackgroundImage
才能像这样使用 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])
【问题讨论】:
创建基模型类合适吗?用user
、image
、caption
、pub_date
字段说BaseImage(models.Model)
,然后创建其他模型,如BackgroundImage(BaseImage)
。
是的,我试过这样。但我不记得为什么,由于某种原因,错误太多。我可以做for循环并从每组中获取图像列表,然后将它们添加在一起吗?
【参考方案1】:
InheritanceManager
作为django-model-utils
的一部分提供,可让您执行此操作,请参阅docs。
在 Linux / Mac 中安装:
sudo pip install django-model-utils
令人讨厌的是,在 Windows 上使用 easy_install
或 pip
安装并不那么简单,请参阅: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
模型中使用ProfilePicture
和BackgroundImage
(我在编辑中添加了UserProfile
模型)吗?
@Aamu ProfilePicture 和 BackgroundImage 的行为将与以前完全相同。我在答案中添加了一个快速而肮脏的 windows 安装方法,如果这不起作用,还有一个替代答案。
对不起。起初我做的是django-models-utils
而不是django-model-utils`。现在它已安装。请您回答我的第二个问题好吗?
ProfilePicture
和 BackgroundImage
的行为将与以前完全相同,它们可以在不导入 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的通用表单模板中显示模型的名称。我考虑过通过表单模板标签访问... 查看详情