Сохранение данных в моделях в Django с отношением ForeignKey - PullRequest
1 голос
/ 17 октября 2019

Когда я анализирую страницу, я не могу сохранить категорию и тему в БД в Django. Что мне делать?

class Category(models.Model):
    category = models.CharField(max_length=50)
    slug = models.CharField(max_length=60, unique=True)

class Topic(models.Model):
    topic = models.CharField(max_length=50)
    slug = models.CharField(max_length=60, unique=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

class Page(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    ...

Я написал это, но это не работает. Скорее всего add () не может быть использован с models.ForeignKey, верно? Если да, то как это сделать?

from django.template.defaultfilters import slugify

...

page = {
    'datetime': datetime,
    'title':title,
    'slug':slug,
    'short_text':short_text,
    'text':text,
    'image':image_name,
    'img_source':img_source,
    'page_source':page_source,
}

try:
    page = Page.objects.create(**page)
except Exception as e:
    print(e, type(e))


category = {'category':category, 'slug':slugify(category)}
category, created = Topic.objects.get_or_create(**category)
page.category.add(category)

topic = {'topic':topic, 'slug':slugify(topic)}
topic, created = Topic.objects.get_or_create(**topic)
page.topic.add(topic)

1 Ответ

1 голос
/ 17 октября 2019

Поскольку это (ненулевое) ForeignKey, поля topic и category должны ссылаться на точно один Topic и Category объект.

* 1009Поэтому вы должны сначала создать объект Category и Topic, а затем создать Page, который использует эти объекты, например:
<b>category</b>, created = Category.objects.get_or_create(
    category=category_name,
    slug=slugify(category_name)
)
<b>topic</b>, created =Topic.objects.get_or_create(
    topic=topic_name,
    slug=slugify(topic_name),
    <b>category=category</b>
)
page = Page.objects.create(
    datetime=datetime,
    title=title,
    slug=slug,
    short_text=short_text,
    text=text,
    image=image_name,
    img_source=img_source,
    page_source=page_source,
    <b>category=category,
    topic=topic</b>
)

Я бы также посоветовалиспользуйте category_name и topic_name над category и topic при создании объектов Category и Topic, поскольку в противном случае вы вводите в заблуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...