我认为问这个问题的最好方法是使用一些代码......我可以这样做吗?(编辑:答案:不)
class MyModel(models.Model):
foo = models.CharField(max_length = 20)
bar = models.CharField(max_length = 20)
def get_foo(self):
if self.bar:
return self.bar
else:
return self.foo
def set_foo(self, input):
self.foo = input
foo = property(get_foo, set_foo)
Run Code Online (Sandbox Code Playgroud)
或者我必须这样做:
class MyModel(models.Model):
_foo = models.CharField(max_length = 20, db_column='foo')
bar = models.CharField(max_length = 20)
def get_foo(self):
if self.bar:
return self.bar
else:
return self._foo
def set_foo(self, input):
self._foo = input
foo = property(get_foo, set_foo)
Run Code Online (Sandbox Code Playgroud)
注意:通过将db_column传递给模型字段,可以将列名保留为数据库中的'foo'.当您处理现有系统并且不希望无缘无故地进行数据库迁移时,这非常有用
我有一个包含许多字段的模型,但是对于这个问题,我只需要其中的3个字段.当我尝试序列化一个.values集合时,我得到一个例外
queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)
Run Code Online (Sandbox Code Playgroud) 您可以按如下方式打印查询集的SQL:
print str(queryset.query)
Run Code Online (Sandbox Code Playgroud)
但是,出于某种原因,这会删除引号,因此您得到:
SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = Foo
Run Code Online (Sandbox Code Playgroud)
代替:
SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = "Foo"
Run Code Online (Sandbox Code Playgroud)
注意到失踪 ""
如何纠正?
亲爱的人们试图帮助他人,
我试图找出如何让Django为我做一个连接,而无需编写自定义SQL.
假设我有以下型号
class Parent(models.Model):
name = models.CharField()
children = models.ManyToManyField(Child, through="Parent_Child", related_name="parents")
class Parent_Child(models.Model):
parent = models.ForeignKey(Parent, related_name='attached_children')
child = models.ForeignKey(Child, related_name='attached_parents')
class Child(models.Model):
name = models.CharField()
toys = models.ManyToManyField(Toy, hrough="Child_Toy", related_name="toy_owners")
class Child_Toy(models.Model):
child = models.ForeignKey(Child, related_name='attached_toys')
toy = models.ForeignKey(Toy, related_name='toy_owner')
class Toy(models.Model):
name = models.CharField
Run Code Online (Sandbox Code Playgroud)
父母可以有多个孩子.一个孩子可以有多个父母.孩子可以拥有多个玩具.玩具可以由多个孩子拥有.
我想获得父母子女拥有的所有玩具清单.
所以,我可以做以下事情:
parent.children.all()
和child.toys.all()
我想做的就是parent.children.toys.all() 当我尝试这样做时,我得到:AttributeError: 'ManyRelatedManager' object has no attribute 'toys'.我理解错误 - parent.children返回多个记录.这是预料之中的.我无法弄清楚的是如何给Django提示我希望它为其查询添加一个额外的连接.
有没有办法在Django中进行此连接,或者我是否需要转到自定义SQL才能执行此操作?
请注意:以上只是为了说明我的问题,我使用的实际模型并不相关.我的问题是试图弄清楚如何在Django中加入多个M2M关系,而不必诉诸SQL.
我提前感谢您的帮助.谢谢!
这个线程没有太大帮助:在查询期间丢失了与MySQL服务器的连接.
我将max_allowed_packet增加到16M,max_connections增加到9999.但是,我仍然收到此错误:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 107, in _result_iter
self._fill_cache()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 772, in _fill_cache
self._result_cache.append(self._iter.next())
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator
for row in compiler.results_iter():
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter
for rows in self.execute_sql(MULTI):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 86, in execute
return self.cursor.execute(query, args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (2013, 'Lost connection to MySQL server …Run Code Online (Sandbox Code Playgroud)