Лучшее решение Django моделей для этого обратного ForeignKey - PullRequest
1 голос
/ 06 января 2020

Я делаю персональный проект по управлению ресторанами. Две из моих моделей сталкиваются с проблемой, эти модели - DiningRoom и Table.

DiningRoom - это представление любой области, которую может иметь ресторан (например, у нас может быть одна область внутри, а другая - на террасе ресторана). здание). И в каждом DiningRoom мы можем установить макет таблиц.

Таким образом, более объектно-ориентированный способ, которым я нахожу отображение, - это отношение многие-к-одному (ForeignKey). Так как один DiningRoom может иметь много столов, а один стол может быть только в одном DiningRoom. Правильно?

Итак, мои модели:

class DiningRoom(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
    name = models.CharField(max_length=50, null=False, blank=False)
    rows = models.IntegerField(max=15, null=False)
    cols = models.IntegerField(max=15, null=False)  # rows and columns are for the room's grid layout.


class Table(models.Model):
    row = models.IntegerField(max=15, null=False)  # The row in the room's grid where the table is at.
    col = models.IntegerField(max=15, null=False)  # the column in the room's grid where the table is at.
    dining_room = models.ForeignKey(DiningRoom, on_delete=models.CASCADE, null=False)  # Here is the problem.

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

def dining_rooms(request):
    try:
        account = Account.objects.get(id=request.session['account_id'])
    except Account.DoesNotExists:
        return response(request, "error.html", {'error': 'Account.DoesNotExists'})

    dining_rooms = DiningRoom.objects.filter(account=account)

Но мне также нужны таблицы результатов в Dining_rooms!

Я нашел два возможных решения, но ни одно из них не кажется мне «правильным». Одним из них является установление отношения «многие ко многим» и подтверждение того, что любая таблица находится только в одном DiningRoom в представлении. И вторым, и хуже, может быть выбор таблиц по одному разу для каждого DiningRoom, полученного в наборе запросов (но представьте себе ресторан с 5 или 6 различными областями (DiningRooms), потребуется каждый раз выбирать базу данных шесть раз).

Выполнение этого наоборот и выборка всех таблиц и select_related DiningRooms невозможна, поскольку возможно иметь DiningRoom без таблиц в нем (и в этом случае у нас будет отсутствовать DiningRooms).

Что может быть лучшим способом справиться с этим? Спасибо!

1 Ответ

1 голос
/ 06 января 2020

Вы можете использовать related_name или отношения задом наперед, приемлемым решением было бы создание метода в модели DiningRoom, который называется related_tables (), и возврат с использованием related_name (modelname_set, в данном случае это будет table_set). Это имя строчной дочерней модели, за которым следует суффикс _set

class DiningRoom(models.Model):
    #your fields

    def associated_tables(self):
        return self.table_set.all()

Кроме того, это видеоурок может очистить ваши дни и дать вам лучшее представление об обратных отношениях: https://youtu.be/7tAZdYRA8Sw

...