Значение по умолчанию, если null или если значение не существует в таблице Django

У меня есть модель продукта, как показано ниже:

class Brand(models.Model):
    name = models.CharField(primary_key=True, max_length=100)

    def __str__(self):
        return self.name


class Product(models.Model):
...
    brand = models.ForeignKey(Brand, on_delete=models.PROTECT, default='Mercedes')
...

When I am posting a product without the brand field it works and sets the product with brand default value, but when I add a brand field like this brand: "", or send a value which doesn't exist inside Brand table like this: brand: "abc123", it shows me informations: This field may not be null. and Invalid pk \"abc123\" - object does not exist.. I still want to set the default value in this situations, so if the value is null or does not exist I want to use the default='Mercedes'. How can I do this?

Для задачи 1). Установите null=True на поле brand в модели Product. Это позволит использовать нулевые значения для этого поля в базе данных.

Для проблемы 2). Предполагая, что вы хотите создать экземпляр бренда, если он не существует, вы можете использовать Model.objects.get_or_create().

obj, created = Brand.objects.get_or_create(
    other_field='Foo', # optional if other fields have defaults
    another_field='Bar', # optional if other fields have defaults
    defaults={'name': 'Toyota'}, # the fallback value if object doesn't exist
)

obj - это полученный или вновь созданный объект, а created скажет вам, существовал ли obj или нет.

Затем используйте obj для brand при создании Product.

Если вы не хотите создавать объект, вы можете просто использовать get() в операторе try except:

from django.core.exceptions import ObjectDoesNotExist

try:
    brand = Brand.objects.get(name="Toyota")
    product = Product.objects.create(brand=brand)
except ObjectDoesNotExist:
    # handle exception
Вернуться на верх