Django способ модели reverse_name с разными связанными классами модели - PullRequest
0 голосов
/ 10 июля 2020

У меня проблема с доступом к моделям разных классов через related_name, и мне нужна ваша помощь, чтобы найти чистое решение, использующее несколько SQL запросов и легко расширяемое:

class RoundTripToDifferentPlaces(models.Model):

    price = models.FloatField(default=0)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    ...
    
class PlaceVisit(models.Model):
    roundtrip = models.ForeignKey(RoundTripToDifferentPlaces,  related_name="place_visit")
    individual_price = models.FloatField(default=0)
    name = models.CharField(max_length=31, null=True)
    street = models.CharField(max_length=31, null=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    ...

class RestaurantVisit(models.Model):
    
    place =  models.OneToOneField(Job, on_delete=models.CASCADE, primary_key=True)
    Some more fields...about pricedetails

class LibraryVisit(models.Model):
    
    place =  models.OneToOneField(Job, on_delete=models.CASCADE, primary_key=True)
    Some more fields...about pricedetails

...many more subcategories of places and i will add more in the future

На мой взгляд Я l oop через RoundTripToDifferentPlaces, и мне нужно получить всю информацию о связанных моделях. Я мог бы sh в своих моделях:

class RestaurantVisit(models.Model):
        
     placevisit =  models.OneToOneField(Placevisit, related_name="specific_visit")
     roundtrip = models.OneToOneField(RoundTripToDifferentPlaces,  related_name="restaurant_visit")

     Some more fields...

 class LibraryVisit(models.Model):
        
     placevisit =  models.OneToOneField(Placevisit, related_name="specific_visit")
     roundtrip = models.OneToOneField(RoundTripToDifferentPlaces,  related_name="library_visit")

     Some more fields...

и в моих представлениях / шаблонах:

 ...
 roundtrip = RoundTripToDifferentPlaces().objects.filter(user = request.user )
 for visit in roundtrip.place_visit.all():
    print(visit)
    print(visit.spefic_visit) #does not work

 #and e.g.:
 print(roundtrip.restaurant_visit) #works perfectly
  

(RoundTrip может иметь только одно посещение или столько, сколько есть разные модели)

Кажется, мне не разрешено давать одни и те же related_name разным классам.

Есть ли обходной путь или это возможно с помощью общих c ключей?

...