IntegrityError при попытке создать отношения "один ко многим" в Python Django

Я начинающий разработчик, работаю над приложением, которое отображает некоторые прогулки, и каждая прогулка должна иметь возможность для пользователей оставлять отзывы.

Я пытаюсь создать отношения между моделями Walk и Review. Каждый Walk должен иметь несколько Reviews, но каждый Review должен принадлежать только одному Walk.

Я пытаюсь создать отношение "один ко многим", но продолжаю получать IntegrityError следующего содержания:

django.db.utils.IntegrityError: Строка в таблице 'walks_walk' с первичным ключом '1' имеет недопустимый внешний ключ: walks_walk.reviews_id содержит значение '2', которое не имеет соответствующего значения в reviews_review.id.

.

Вот мои модели:

Прогулка

from django.db import models

from reviews.models import Review


class Walk(models.Model):
    # walk ID automatically generated
    walk_name = models.CharField(max_length=100)
    walk_reviews = models.ForeignKey(Review, on_delete=models.CASCADE, default="No reviews yet")

Review

from datetime import date
from operator import mod
from statistics import mode
from tkinter import CASCADE
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
from django.contrib.auth.models import User # change to updated bespoke User model vs built-in

class Review(models.Model):
    # Review ID auto-created
    author = models.ForeignKey(User, on_delete=models.CASCADE, default="")
    title = models.CharField(max_length=100)
    body = models.TextField(max_length=3000)

Я попробовал несколько вариантов и очистил данные тестовой базы данных, но проблема сохраняется. Что может быть причиной, и как я могу решить эту проблему? Спасибо!

Добро пожаловать в удивительный мир программной инженерии!

Звучит интуитивно, но то, что вы хотите сделать, это связать обзор с прогулкой, а не прогулку с обзором.

class Review(models.Model):
    # Review ID auto-created
    author = models.ForeignKey(User, on_delete=models.CASCADE, default="")
    title = models.CharField(max_length=100)
    body = models.TextField(max_length=3000)
    walk = models.ForeignKey(Walk, on_delete=models.CASCADE)

Затем, когда вы создаете обзор, ссылайтесь на прогулку, для которой он был создан.

По вашей схеме, у прогулки может быть только один отзыв.

Также посмотрите в документации Django на 'related_name', чтобы вы могли дать объекту walk имя свойства, которое имеет смысл для ссылки на все связанные с ним обзоры, например, 'all_reviews' или что-то подобное

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