【问题标题】:AutoField should be present but it's not (django)?AutoField 应该存在但它不是(django)?
【发布时间】:2020-11-22 13:27:42
【问题描述】:

看着:

https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.save

为方便起见,每个模型默认都有一个名为 id 的 AutoField 除非您在您的字段中明确指定 primary_key=True 模型。有关详细信息,请参阅 AutoField 的文档。

https://docs.djangoproject.com/en/3.1/topics/db/models/

似乎很清楚,一个对象总是有一个 id。我有一个模型:

class Currency(models.Model):
    currency_name = models.CharField(max_length=100)
    currency_value_in_dollars = models.FloatField()
    currency_value_in_dollars_date = models.DateField()

    def __str__(self):
        return self.currency_name

我已迁移为:

operations = [
    migrations.CreateModel(
        name='Currency',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ('currency_name', models.CharField(max_length=100)),
            ('currency_value_in_dollars', models.FloatField()),
            ('currency_value_in_dollars_date', models.DateField()),
        ],
    ),

当尝试向数据库添加条目时:

def update_coins_table():
    if not do_greeting():
        print("Gecko crypto board not reachable. Db setup")
        return

    crypto_coins_prices = cg.get_price(ids=coins_ids_str, vs_currencies='usd')
    timezone_now = timezone.now()
    for coin_key in crypto_coins_prices:
        coin = Currency(coin_key, crypto_coins_prices[coin_key]['usd'], timezone_now)
        coin.save()

行:

coin = Currency(coin_key, crypto_coins_prices[coin_key]['usd'], timezone_now)

给予:

unable to get repr for <class 'manage_crypto_currency.models.Transaction'> 

coin.save()

失败。如果我将有问题的行替换为:

coin = Currency(1, coin_key, crypto_coins_prices[coin_key]['usd'], timezone_now)

它有效。 id 不应该自动递增吗?

最后一行总是覆盖前一行,最后只存储一个条目。

【问题讨论】:

    标签: python python-3.x django


    【解决方案1】:

    第一个位置参数仍然是id。这是否是AutoField 无关紧要。特别是因为Django也使用构造函数从数据库中加载模型对象,有时你想要指定id,因为你想要更新一个对象。

    如果不想指定主键,可以使用None

    #                &downarrow; use None such that the database will provide an id
    coin = Currency(None, coin_key, crypto_coins_prices[coin_key]['usd'], timezone_now)

    但无论如何,仍然是“不稳定的”,因为在某处添加额外的字段会导致参数的顺序发生变化。最好使用named参数:

    coin = Currency(
        currency_name=coin_key,
        currency_value_in_dollars=crypto_coins_prices[coin_key]['usd'],
        currency_value_in_dollars_date=timezone_now
    )

    注意:Django 的DateTimeField [Django-doc] 有一个auto_now_add=… parameter [Django-doc] 使用时间戳。这将自动分配当前日期时间 创建对象时,将其标记为不可编辑(editable=False),例如 默认情况下它不会出现在ModelForms 中。

    【讨论】:

    • 管理保存条目;本来可以更直观的
    猜你喜欢
    • 2011-06-20
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多