Джанго: Как представлять и запросить симметричные отношения для семейного древа?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Джанго: Как представлять и запросить симметричные отношения для семейного древа?

Сообщение Anonymous »

Я строю приложение генеалогического древа в Джанго, где мне нужно представлять в браках симметрично. Каждый брак должен иметь только одну запись, а отношения должны включать обоих партнеров без дублирования данных. Вот соответствующая структура модели: < /p>
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
spouses = models.ManyToManyField(
'self', through="Marriage", symmetrical=True, related_name="partners"
)

class Marriage(models.Model):
person1 = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="marriages_as_person1")
person2 = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="marriages_as_person2")
start_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)
< /code>
Я хочу: < /p>

[*] Убедитесь, что оба партнера появляются как супруги друг для друга симметрично. < /li>
Избегайте дублирующихся записей для одного и того же брака. < /li>
Эффективно запросить всех супругов человека. > Вот код, который я использую для запроса супругов: < /p>
# Query spouses for a person
p1 = Person.objects.create()
p2 = Person.objects.create()
Marriage.objects.create(person1=p1, person2=p2)

p1.spouses.all() # Returns list containing p2
p2.spouses.all() # Returns empty list
< /code>
Тем не менее, я сталкиваюсь с проблемами: < /p>

Если P1 < /code> супруги запрашиваются, он должен содержать P2 и если P2 супруги запрошены, он должен содержать P1
[*] Оба запроса не являются симметричными

Вопросы: < /h3>

Является ли моя структура модели правильной для симметричного представления браков? Если нет, то какие улучшения я должен сделать? ol>
Мой вариант использования - вернуть список или человека, имеющего PID < /code> (идентификатор партнера) в качестве списка идентификатора, как ниже, используя DRF < /p>
[
{
id: 1,
full_name: ‘John’,
pids: [2]
},
{
id: 2,
full_name: ‘Mary’,
pids: [1]
}
]
< /code>
Текущий код сериализатора-< /p>
def get_pids(self, obj):
"""
Returns a list of IDs of all the spouses of the person, ensuring bidirectional relationships.
"""
partner_ids = set(obj.spouses.values_list('id', flat=True))
# Ensure bidirectional relationships
for spouse in obj.spouses.all():
partner_ids.update(spouse.spouses.values_list('id', flat=True))

return list(partner_ids)


Подробнее здесь: https://stackoverflow.com/questions/793 ... amily-tree
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Django: как представлять и запрашивать симметричные отношения для генеалогического древа?
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Django: как представлять и запрашивать симметричные отношения для генеалогического древа?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Django: как представлять и запрашивать симметричные отношения для генеалогического древа?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как защитить категории с помощью семейного контроля в iOS
    Anonymous » » в форуме IOS
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Алгоритм семейного дерева [закрыто]
    Anonymous » » в форуме Javascript
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»