Mam projektu Django z 2 apps tak:Unikaj Cykliczne Imports modelarskie w Django Apps
## tags app, models.py
class Tag(models.Model):
title = models.CharField(max_length=50)
## items app, models.py
from application.tags.models import Tag
class Item(models.Model):
title = models.CharField(max_length=300)
tags = models.ManyToManyField(Tag, related_name="items")
UPDATE do wyjaśnienia funkcja lokalizacji
Mam metodę na innym modelu w items.models
który dostaje wszystkie elementy, które mają zestaw tagów.
Powstały zapytanie jest jak:
## Gets all of the items that have tags t1 and t2
Item.objects.filter(tags=t1).filter(tags=t2)
Metoda ta wykorzystuje model Item
jak również modelu Tag
, który jest ok, ponieważ Tag jest importowany do aplikacji pozycji.
Jednak chcę mieć dostęp do tej metody w aplikacji znaczników, ale spowodowałoby to cykliczny import.
Teraz moim obejściem, aby uzyskać wszystkie elementy z zestawem znaczników w aplikacji znaczników, jest ustawienie przecięcia na odwrotnej relacji w wielu do wielu pól.
## Get all items that have the tags with ids tag_ids
item_set = set(Tag.objects.get(pk=tag_ids[0]).items.all())
for cur_tag_id in tag_ids[1:]: ## for all of the rest of the tags
item_set = item_set & set(Tag.objects.get(pk=cur_tag_id).items.all())
Powoduje to uzyskanie kilku kolejnych zapytań i ustawionego przecięcia. Czy istnieje sposób na zrobienie czegoś takiego jak Item.objects.filter(tags=t1).filter(tags=t2)...
z modelu Tag w aplikacji znaczników?
Udało mi się ominąć to za pomocą contenttypes
, aby uzyskać model Item
, aby wykonać to samo zapytanie. Czy jest to do przyjęcia, czy istnieje lepszy sposób na uporządkowanie tego kodu?
Nie podałeś wszystkich istotnych informacji. Gdzie jest zdefiniowana twoja metoda filtrowania? Dlaczego nie możesz umieścić go gdzieś, który może być zaimportowany przez obie aplikacje? –
Oto problem, który próbuję naprawić. Jest to metoda na innym modelu w aplikacji z przedmiotami. Problem polega na tym, że importuje tag items.models, a jeśli ta metoda jest w innym miejscu, musiałby zaimportować element i znacznik. Tag nie może go zaimportować lub nadal będzie okrągły. – jkeesh