Обновление данных в таблице с внешними ключами в Django

У меня есть две таблицы, одна из которых связана с другой внешним ключом. Модель store_table уже состоит из трех строк, для трех разных магазинов.

Сейчас я пытаюсь обновить модель price_table, но я не совсем уверен, что понимаю, как использовать внешние ключи, чтобы она знала, какой price_table элемент должен быть связан с каким store_table id.

Есть предложения о том, как этого достичь?

Мои две модели

class store_table(models.Model):
    store = models.CharField(max_length=100, null=True)
    number = models.BigIntegerField(null=True)
    class Meta:
        unique_together = (
            (
                "store",
                "number",
            ),
        )

class price_table(models.Model):
    price = models.CharField(max_length=100, null=True)
    dates = models.DateField(null=True, blank=True)
    store_id = models.ForeignKey(
        store_table, on_delete=models.CASCADE, default=None
    )
    class Meta:
        unique_together = (
            (
                "dates",
                "price",
            ),
        )

Мой код для обновления таблицы price_table

update_models = price_table(
            dates=dates,
            price=price
        )
        update_models.save()

Здесь есть несколько вещей, которые меня смутили, но я думаю, что это то, что вам нужно:

# NOTE: store is the store instance you want the price to be associated with
# For example, store = store_table.objects.get(pk=...)
# And you could iterate through every store object and CREATE the price
# for that store using the code below.  Again, this does not UPDATE,
# this CREATES a new price_table object for that store_table object.

update_models = price_table(
            store_id=store
            dates=dates,
            price=price
        )
update_models.save()

Почему я запутался? Приведенный выше код создаст новый объект price_table, а не обновит его. Если бы у вас уже был объект price_table, который вы хотели бы UPDATE, то есть изменить, то он уже был бы связан с магазином, и в этом случае вы могли бы сделать следующее:

# update_models here would be an object you FIND, not CREATE, for example,
# update_models = price_table.objects.get(pk=...)

update_models.dates = dates
update_models.price = price
update_models.save()

Помните, вы не можете обновить МОДЕЛЬ, вы обновляете ИНСТАНС модели. Модель - это просто шаблон для создания экземпляров или объектов на основе этой модели. Вы не обновляете шаблон, вы обновляете экземпляр. Итак, если ИНСТАНС вашей таблицы price_table еще НЕ имеет связанной с ней таблицы sales_table (вы, в конце концов, установили default=None для store_id), то вы можете модифицировать вышеприведенное так:

# Again, here, update_models will be a price_table INSTANCE you find, and
# store would be the store_table object you find, i.e.
# store = store_table.objects.get(pk=...)
# where pk is the primary key of the store you want the price associated with

update_models.store_id = store
update_models.dates = dates
update_models.price = price
update_models.save()

Еще кое-что меня смутило. Для классов нужно использовать регистр Паскаля, то есть вместо store_table писать Store, вместо price_table писать Price (это все таблицы, в конце концов).

Это еще один момент, который меня смутил. Цена должна быть каким-то числом, верно? Тогда зачем использовать ее как поле CharField? Не лучше ли вместо этого использовать DecimalField?

Надеюсь, это поможет.

Вернуться на верх