我想用Django更新一个表 - 在原始SQL中是这样的:
update tbl_name set name = 'foo' where name = 'bar'
Run Code Online (Sandbox Code Playgroud)
我的第一个结果是这样的 - 但这很讨厌,不是吗?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Run Code Online (Sandbox Code Playgroud)
有更优雅的方式吗?
我可以dumpdata在一个模型上执行一个Django,而不是整个应用程序,如果是这样,怎么样?
对于一个应用程序,它将是:
python manage.py dumpdata myapp
Run Code Online (Sandbox Code Playgroud)
但是,我想要一些特定的模型,例如"myapp.mymodel"被转储.原因是,我有一些巨大的,300万条记录,数据集在同一个应用程序中,我不喜欢转储.
我正在尝试设置我的上传,以便如果用户joe上传文件,则转到MEDIA_ROOT/joe,而不是让每个人的文件都转到MEDIA_ROOT.问题是我不知道如何在模型中定义它.以下是目前的情况:
class Content(models.Model):
name = models.CharField(max_length=200)
user = models.ForeignKey(User)
file = models.FileField(upload_to='.')
Run Code Online (Sandbox Code Playgroud)
所以我想要的不是'.' 作为upload_to,让它成为用户的名字.
据我所知,从Django 1.0开始,您可以定义自己的函数来处理upload_to,但该函数不知道用户是谁,所以我有点迷失.
谢谢您的帮助!
自动设置对象的创建日期的最佳方法是什么,以及将在上次更新对象时记录的字段?
在我的模型中,我有:
created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)
Run Code Online (Sandbox Code Playgroud)
在我看来:
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
return HttpResponseRedirect('obj_list')
Run Code Online (Sandbox Code Playgroud)
我收到错误:
objects_object.created_at may not be NULL
Run Code Online (Sandbox Code Playgroud)
我是否必须自己手动设置此值?我认为这是传递给DateTimeFields的参数点(或者它们只是默认值,因为我设置'editable = False'它们不会显示在表单上,因此不会在请求中提交,因此不要进入表格?).
这样做的最佳方法是什么?一个init方法?
谢谢
ps - 我是django和Python的新手......
我的模特 - >
class Sample(models.Model):
users = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)
我想这样做(在这个模型中保存用户,user1和user2) - >
user1 = User.objects.get(pk=1)
user2 = User.objects.get(pk=2)
sample_object = Sample(users=user1, users=user2)
sample_object.save()
Run Code Online (Sandbox Code Playgroud)
我知道这是错的:D,但我确定你得到了我想要做的......所以你会怎么做?
在Django中,您可以指定以下关系:
author = ForeignKey('Person')
Run Code Online (Sandbox Code Playgroud)
然后在内部它必须将字符串"Person"转换为模型Person.
这样做的功能在哪里?我想用它,但我找不到它.
目前我的代码中有很多python对象,类似于以下内容:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
Run Code Online (Sandbox Code Playgroud)
现在我想把它变成一个Django模型,其中self.myName是一个字符串字段,self.myFriends是一个字符串列表.
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
Run Code Online (Sandbox Code Playgroud)
由于列表是python中常见的数据结构,我希望它有一个Django模型字段.我知道我可以使用ManyToMany或OneToMany关系,但我希望避免代码中的额外间接.
编辑:
我添加了这个相关的问题,人们可能觉得有用.
我有模型Foo有字段栏.bar字段应该是唯一的,但允许空值,这意味着如果bar字段是null,我想允许多个记录,但如果不是,null则值必须是唯一的.
这是我的模型:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
Run Code Online (Sandbox Code Playgroud)
这是表的相应SQL:
CREATE TABLE appl_foo
(
id serial NOT NULL,
"name" character varying(40) NOT NULL,
bar character varying(40),
CONSTRAINT appl_foo_pkey PRIMARY KEY (id),
CONSTRAINT appl_foo_bar_key UNIQUE (bar)
)
Run Code Online (Sandbox Code Playgroud)
当使用管理界面创建多个bar为空的foo对象时,它会给出一个错误:"Foo with this Bar已经存在."
但是当我插入数据库(PostgreSQL)时:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
Run Code Online (Sandbox Code Playgroud)
这很好用,它允许我插入超过1条记录,条形为空,所以数据库允许我做我想要的,这只是Django模型的错误.有任何想法吗?
编辑
就DB而言,解决方案的可移植性不是问题,我们对Postgres感到满意.我已经尝试设置一个可调用的唯一,这是我的函数返回True/False为特定的bar值,它没有给出任何错误,但是如果它没有任何影响那么缝合.
到目前为止,我已经从bar属性中删除了唯一的说明符并处理了应用程序中的bar唯一性,但仍然在寻找更优雅的解决方案.有什么建议?
有没有使用任何方式get_object_or_404和select_related在一起或者任何其他方式来实现使用这两个在一起(除了把它在尝试/除外)的结果?
如何在同一个查询集上运行update和select语句,而不是必须执行两个查询,一个用于选择对象,另一个用于更新对象?
SQL中的等价物如下:
update my_table set field_1 = 'some value' where pk_field = some_value
Run Code Online (Sandbox Code Playgroud)