2011-08-03 15 views
8

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?

+0

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? –

+0

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

Odpowiedz

23

Podczas definiowania modeli z kluczy obcych, można użyć formatu:

tags = models.ManyToManyField('tags.Tag', ...) 

Oznacza to, że nie trzeba być importowane klasę Tag, właśnie zainstalowałeś aplikację tagów.

Następnie można zapisać funkcję w innej lokalizacji, która może importować zarówno znacznik, jak i pozycję, i nie trzeba się martwić o importowanie okrężne.

+0

Dzięki. Pomaga to, ale problem polega na tym, że jeśli chcę korzystać z tej funkcji z innej lokalizacji w modelach dla obu aplikacji, nadal otrzymuję import cykliczny. – jkeesh

+9

Możesz użyć django.db.models.get_model ("app.Model"), aby uzyskać odniesienie do modelu bez konieczności jego importowania. To pomaga? –

+1

To wystarczy! Potrzebowałem get_model ("app", "Model"), ale to zadziałało. Czy złym zwyczajem jest pobieranie modeli w ten sposób? – jkeesh