В моей модели есть несколько сайтов, каждый из которых ссылается на набор адресов электронной почты. Электронное письмо должно быть отправлено на адрес email_address каждого веб-сайта, чтобы объекты email_message и email_address разделяли отношение ManytoMany. Я хотел бы получить доступ к свойствам веб-сайта email_address email_message, и я хотел бы сделать это в ModelAdmin email_message. Таким образом, здесь используется несколько уровней ссылок.
Это очень упрощенная версия моего кода, поэтому, пожалуйста, дайте мне знать, если вам нужно что-то, что я пропустил.
models.py
class Email_message(models.Model):
email_addresses = models.ManyToManyField(Email_address, related_name='email_messages')
subject = models.CharField(max_length=50)
body = models.TextField()
date_time = models.DateTimeField(null=True, blank=True)
class Email_address(models.Model):
address = models.EmailField()
contact_name = models.CharField(max_length=50, null=True, blank=True)
website = models.ForeignKey(Website, on_delete=models.CASCADE, related_name='email_addresses', null=True)
class Website(models.Model):
domain = models.URLField(default=None)
searches = models.ManyToManyField(Search, related_name='websites', blank=True)
def __str__(self):
return self.domain
@property
def get_likely_location(self):
searches = self.searches.all()
locations = []
for search in searches:
if search.location is not None:
locations.append(search.location)
return max(set(locations), key = locations.count)
admin.py
class Email_messageAdmin(admin.ModelAdmin):
fields = ['id', 'email_addresses', 'date_time', 'subject', 'body', 'preview_random_email']
readonly_fields = ['id', 'preview_random_email']
def preview_random_email(self, obj):
print("This always prints")
test = obj.email_addresses.first().searches.all()
print("If things are working, this will print")
return format_html(test)
Я бы хотел, чтобы вы сосредоточились на этом admin.py
классе. Вы можете видеть, что я включил 2 print
функций. Как описано в их параметрах, первый всегда печатает, а второй будет печатать только при некоторых обстоятельствах. Он ломается, если я запускаю test = obj.email_addresses.first().searches.all()
, но работает, если я изменяю эту строку на что-то более короткое, например test = obj.email_addresses.first().id
. Кажется, есть предел тому, насколько глубоко я могу go, что, я не думаю, должно произойти.
Когда возникает проблема, все до строки test = ...
будет функционировать, как ожидалось, но все после будет просто проигнорировано. Django не выдает никакой ошибки и даже не признает наличие проблемы. Он просто отказывается от оставшейся части моего кода.
Если это помогает, я также могу сказать, что он ломается таким же образом, когда я запускаю test = obj.email_addresses.first().get_likely_location
, но я не уверен, что написание свойства таким способом работает и не хочет заниматься слишком многими вещами одновременно.