标签: django-database

Django - 遗留数据库和'id'字段的问题

我正在将一个来自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 django-models django-database

5
推荐指数
2
解决办法
2600
查看次数

在Django中,我可以在创建对象时指定数据库吗?

看看这个 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)

或者现在这样做已经太晚了,因为这些标志在构造函数中使用并且必须仅在构造函数中设置?

python django orm django-orm django-database

5
推荐指数
1
解决办法
1722
查看次数

在Django 1.9.2数据库sqlite3中插入列表

我想在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)

django django-models django-database

5
推荐指数
1
解决办法
2355
查看次数

Django 在 DATABASES 中设置 TIME_ZONE 对“日期”查找没有影响

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))

\n\n

典型用法是用于日期时间不以 UTC 存储的旧数据库。

\n\n

没有日期查找

\n\n

查询我的数据库会考虑此设置,例如:

\n\n

settings.py

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在里面manage.py shell

\n\n
>>> dt = …
Run Code Online (Sandbox Code Playgroud)

python django django-database django-settings django-1.11

5
推荐指数
1
解决办法
1万
查看次数

Django @ transaction.atomic()阻止在并发中创建对象

我有一个票模型,它的票序列化器.票证模型有一个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)
  • 在故障单序列化程序中,验证时序列化程序会检查是否有任何具有所需席位和显示的故障单
    • 如果有票,则检查票是否被买入.
      • 如果它被购买,那么它将引发错误.
      • 如果没有购买,请检查是否在5分钟内预订了机票.
        • 如果在5分钟内预订,则引发错误.
        • 否则,如果预订时间超过5分钟,则删除旧票并返回有效.
  • 如果没有票,则返回有效

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)

django django-database

5
推荐指数
1
解决办法
747
查看次数

在django中的单个connection.cursor上执行多个。安全吗?

我正在使用 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

4
推荐指数
1
解决办法
6254
查看次数

如何将唯一性与冲突数据一起引入?

我为我的网站编写了一个 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。

谢谢你的帮助!

django django-database django-1.7 django-migrations

4
推荐指数
1
解决办法
900
查看次数

迭代django对象以更新它们的最有效方法是什么?

所以我有一个查询集要更新

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+)的最佳方法是什么?

python django django-database

4
推荐指数
1
解决办法
1563
查看次数

Django 测试 commit_on_success

我有一个函数,我已经将其封装@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

python django django-database django-unittest

4
推荐指数
1
解决办法
2947
查看次数

如何在Django中测试关闭数据库连接的方法?

我有一个使用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距离设置的默认值设置TrueFalse这反过来又导致close_if_unusable_or_obsolete试试,反正(关闭连接https://开头的github .com/django/django/blob/master/django/db/backends/base/base.py#L497).

我想我也可以connection.close在测试中嘲笑所以它什么都不做,但这看起来有点像hacky.

测试需要关闭数据库连接的django方法的最佳方法是什么?

django django-testing django-database

4
推荐指数
1
解决办法
816
查看次数