我正在将一个来自php应用程序的MySQL数据库集成到一个新的Django项目中.Inspectdb运行良好,我只需要将几个字段更改为ForeignKeys,现在所有的读取和编辑当前数据都运行良好.
问题是当我尝试创建一个新条目时,我得到了错误"Field 'id' doesn't have a default value".回溯从form.save()调用开始,异常来自MySQL游标.在大多数情况下,列被命名,id但在一种情况下,它是一个命名值:
class ModelOne(models.Model): #normal "id" named pk
id = models.AutoField(primary_key=True, db_column='id', default=None)
other_fields = ...
class ModelTwo(models.Model): #specific pk
named_pk = models.AutoField(primary_key=True, db_column='named_pk',
default=None)
other_fields = ...
Run Code Online (Sandbox Code Playgroud)
对于ModelTwo,当我发布一个有效的表单时,我收到了错误,但是如果我回到我的数据列表,则会出现新项目!在我检查了idshell中的最新值之后,我可以看到它们正在递增.
但对于ModelOne(仅使用id),错误仍会显示,并且pk变为2147483647(最大值),后续保存因重复ID而失败.(下一个最高PK只有62158)
我需要做些什么才能使这些id字段正常工作?
更新:仍然没有运气解决这个问题.考虑转储数据并将其导入到新建的Django表中.仍在寻找这个问题的解决方案.
update2:来自db shell的信息
ModelOne:
+-------------+--------------+-------+------+---------+-----------------+
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | NO | PRI | NULL | auto_increment | …Run Code Online (Sandbox Code Playgroud) 看看这个 Django ORM 代码:
my_instance = MyModel()
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)
Run Code Online (Sandbox Code Playgroud)
此时,在第二行,Django会抛出错误:
ValueError: Cannont assign "<OtherModel: ID>": instance is on database "default", value is on database "other_db"
Run Code Online (Sandbox Code Playgroud)
对我来说,这没有多大意义。my_instance如果我什至没有调用,Django 如何知道哪个数据库是:
my_instance.save(using='some_database')
Run Code Online (Sandbox Code Playgroud)
然而?
我猜想,在构造对象期间,Django 会自动将其分配给default数据库。我可以改变它吗?我可以在创建对象时通过将参数传递给其构造函数来指定数据库吗?根据文档,创建对象时我可以传递的唯一参数是其字段的值。那么我该如何解决我的问题呢?
在 Django 1.8 中,有一个名为Model.from_db ( https://docs.djangoproject.com/en/1.8/ref/models/instances/ ) 的新方法,但我使用的是早期版本的 Django,无法切换到现在较新。查看实现,它所做的只是设置两个模型的属性:
instance._state.adding = False
instance._state.db = db
Run Code Online (Sandbox Code Playgroud)
那么将我的代码更改为:
my_instance = MyModel()
my_instance._state.adding = False
my_instance._state.db = 'other_db'
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)
Run Code Online (Sandbox Code Playgroud)
或者现在这样做已经太晚了,因为这些标志在构造函数中使用并且必须仅在构造函数中设置?
我想在Django数据库中存储一个列表。我应该使用哪个模型字段以及如何使用。我尝试了ArrayField,但它没有列表。
from django.contrib.postgres.fields import ArrayField
from django.db import models
class signup(models.Model):
userid=models.CharField(max_length=10)
password=models.CharField(max_length=10)
list=ArrayField(models.IntegerField(null=True,blank=True),size=5,null=True)
score=models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud) 2019 年 4 月 8 日更新
\n\n这是 django<=2.2 的一个已知错误,自此PR起已修复
\n\n===================================
\n\n(我们假设mysql后端)
\n\n我可以在 中设置TIME_ZONE多次settings.py,一次用于全局 django 应用程序,一次用于每个数据库(请参阅https://docs.djangoproject.com/en/1.11/ref/settings/#time-zone (ref1))
典型用法是用于日期时间不以 UTC 存储的旧数据库。
\n\n查询我的数据库会考虑此设置,例如:
\n\n在settings.py
USE_TZ = True\nTIME_ZONE = \'Europe/Paris\' # tz1\nDATABASES = {\n \'legacy\': {\n \'ENGINE\': \'django.db.backends.mysql\',\n \'OPTIONS\': {\n \'read_default_file\': \'....cnf\',\n },\n \'TIME_ZONE\': \'Europe/Paris\', # tz2\n },\n \'default\' : {\n \'ENGINE\': \'django.db.backends.mysql\',\n \'OPTIONS\': {\n \'read_default_file\': \'....cnf\',\n },\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在里面manage.py shell
>>> dt = …Run Code Online (Sandbox Code Playgroud) 我有一个票模型,它的票序列化器.票证模型有一个bought和一个booked_at字段.还有unique_togethershow和seat 的属性.
class Ticket(models.Model):
show = models.ForeignKey(Show, on_delete=models.CASCADE)
seat = models.ForeignKey(Seat, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
booked_at = models.DateTimeField(default=timezone.now)
bought = models.BooleanField(default=False)
class Meta:
unique_together = ('show', 'seat')
Run Code Online (Sandbox Code Playgroud)
TicketSerializer:
class TicketSerializer(serializers.Serializer):
seat = serializers.PrimaryKeyRelatedField(queryset=Seat.objects.all())
show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all())
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
bought = serializers.BooleanField(default=False)
def validate(self, attrs):
if attrs['seat']:
try:
ticket = Ticket.objects.get(show=attrs['show'], seat=seat)
if not ticket.bought:
if ticket.booked_at < timezone.now() - datetime.timedelta(minutes=5):
# ticket booked crossed the …Run Code Online (Sandbox Code Playgroud) 我正在使用 connection.cursor 打开一个游标,执行一系列删除操作,然后关闭游标。它有效,但我不确定它是否有任何副作用。如有任何反馈,我们将不胜感激。
from django.db import connection
c=connection.cursor()
try:
c.execute('delete from table_a')
c.execute('delete from table_b')
...
finally:
c.close()
Run Code Online (Sandbox Code Playgroud) python django database-connection django-database database-cursor
我为我的网站编写了一个 qna 脚本,为了防止用户开始讨论,我希望每个用户只能回复一次。
class Q(models.Model):
text = models.TextField()
user = models.ForeignKeyField('auth.User')
class A(models.Model):
text = models.TextField()
user = models.ForeignKeyField('auth.User')
q = models.ForeignKeyField('Q')
class Meta:
unique_together = (('user','q'),)
Run Code Online (Sandbox Code Playgroud)
现在迁移给了我:
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: columns user_id, q_id are not unique
Run Code Online (Sandbox Code Playgroud)
当然,独特之处与现有数据发生冲突。我现在需要知道的是如何告诉迁移删除冲突的答案。一个愚蠢的解决方案,比如保留第一个找到的解决方案已经是一个很大的帮助。更好的是通过自定义函数比较冲突的 A 的方法。
我正在使用新的迁移系统运行 Django-1.7 - 而不是 South。
谢谢你的帮助!
所以我有一个查询集要更新
stories = Story.objects.filter(introtext="")
for story in stories:
#just set it to the first 'sentence'
story.introtext = story.content[0:(story.content.find('.'))] + ".</p>"
story.save()
Run Code Online (Sandbox Code Playgroud)
而save()操作完全破坏了性能。并且在进程列表中,“ ./ manage.py shell”有多个条目,是的,我通过django shell运行了它。
但是,过去我运行过不需要使用save()的脚本,因为它更改了许多字段。这些脚本非常出色。我的项目有此代码,这可能与为什么这些脚本如此出色有关。
@receiver(signals.m2m_changed, sender=Story.tags.through)
def save_story(sender, instance, action, reverse, model, pk_set, **kwargs):
instance.save()
Run Code Online (Sandbox Code Playgroud)
有效更新大型查询集(10000+)的最佳方法是什么?
我有一个函数,我已经将其封装@transaction.commit_on_success并在其上运行 Django 单元测试。
该函数太长无法粘贴,但一些伪代码是:
@transaction.commit_on_success
def func():
order = Order.create()
order.save()
OrderItem.create(order=order)
test = 10/0 # make sure we run into an error
Run Code Online (Sandbox Code Playgroud)
然后在我的单元测试中我检查是否 len(Order.objects.all()) == 0
我的函数正在返回一个有效的 Order 对象,因此正在提交事务。
我在这里做错了什么?
编辑:我在 Django 1.5
我有一个使用Django ORM的长期运行的Python进程.它看起来像这样:
import django
from django.db import connection
from my_app import models
def my_process():
django.setup()
while (True):
do_stuff()
connection.close()
models.MyDjangoModel().save()
Run Code Online (Sandbox Code Playgroud)
有时do_stuff需要很长时间,此时我遇到了一个错误,我的MySql连接超时,因为数据库服务器将连接作为空闲终止.添加connection.close()行强制django每次都获得一个新连接并修复该问题.(参见https://code.djangoproject.com/ticket/21597).
但是,我正在使用a测试此进程django.test.TestCase,并且调用connection.close导致这些测试失败,因为django的TestCase类在事务中包装测试,并且在该事务中关闭连接会导致事务中断并引发a django.db.transaction.TransactionManagementError.
在解决这个问题,我试过的尝试是设置CONN_MAX_AGE数据库参数并调用connection.close_if_unusable_or_obsolete代替,但交易也改变了连接的autocommit距离设置的默认值设置True到False这反过来又导致close_if_unusable_or_obsolete试试,反正(关闭连接https://开头的github .com/django/django/blob/master/django/db/backends/base/base.py#L497).
我想我也可以connection.close在测试中嘲笑所以它什么都不做,但这看起来有点像hacky.
测试需要关闭数据库连接的django方法的最佳方法是什么?