Разделитель Foreignkey Django

Существует модель:

class Categories(models.Model):
name = models.CharField(max_length=150, unique=True, verbose_name='Name')
slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')

class Products(models.Model):
name = models.CharField(max_length=150, unique=True, verbose_name='Name')
slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')
category = models.ForeignKey(to=Categories, on_delete=models.PROTECT, verbose_name='Categoy')

Я не понимаю, как сделать так, чтобы в Products я мог писать category_id через запятую. То есть, чтобы у одного товара были разные категории. Есть ли какие-нибудь аргументы-разделители для Foreignkey? Для примера покажу свою идею на псевдокоде

category = models.ForeignKey(to=Categories, on_delete=models.PROTECT, separator=';')

Я думаю, что вам следует использовать ManyToManyField. Это создаст отношения "многие ко многим" между таблицами

Код примера:

class Category(models.Model):
    name = models.CharField(max_length=150, unique=True, verbose_name='Name')
    slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')

class Products(models.Model):
    name = models.CharField(max_length=150, unique=True, verbose_name='Name')
    slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')
    categories = models.ManyToManyField(Category, verbose_name='Categoies)

Вы не . ForeignKey относится (максимум) к одному предмету, поэтому по одному Categories для каждого Product.

If you need zero, one, or more categories, you use a ManyToManyField [Django-doc], this works with a junction table [wiki], which is typically how you implement many-to-many relations in a relational database. This is indeed not a comma separated list, but that would probably not be a good idea anyway, since it essentially breaks first normal form (1NF) [wiki]:

class Category(models.Model):
    name = models.CharField(max_length=150, unique=True, verbose_name='Name')
    slug = models.SlugField(
        max_length=200, unique=True, blank=True, null=True, verbose_name='URL'
    )


class Product(models.Model):
    name = models.CharField(max_length=150, unique=True, verbose_name='Name')
    slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')
    categories = models.ManyToManyField(Category, verbose_name='Categoies')

Note: Normally a Django model is given a singular name [django-antipatterns], so Category instead of Categories.

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