У меня есть 5 моделей с внешними ключами в Django (версия 3.0.5, Python 3.6.5). Вот эти модели:
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(_('nick name '), max_length=48, unique=True)
first_name = models.CharField(_('First name '), max_length=48)
last_name = models.CharField(_('family name '), max_length=48)
email = models.EmailField(_(' Emial address'), unique=True)
date_joined = models.DateTimeField(
_('date_joined'), auto_now=False, auto_now_add=True)
date_updated = models.DateTimeField(
_('date_updated '), auto_now=True, auto_now_add=False)
is_active = models.BooleanField(_('is your account active '), default=True)
is_staff = models.BooleanField(
_('is the user among admin team '), default=True)
avatar = models.ImageField(
upload_to='profile_image', blank=True, null=True)
class ForumsPosts(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
category = models.ForeignKey(Post_Category, on_delete=models.CASCADE)
sub_category = models.ForeignKey(Post_Sub_Category, on_delete=models.CASCADE)
title = models.CharField(max_length=64)
content = models.TextField(max_length=65536)
date_created = models.DateTimeField(auto_now =False, auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
class ForumsPostImages(models.Model):
id = models.AutoField(primary_key=True)
post = models.ForeignKey(ForumsPosts, on_delete=models.CASCADE)
images = models.ImageField(upload_to='ForumsPostimages/%Y/%m/%d', blank=True, null=True
)
class ForumsComments(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
post = models.ForeignKey(ForumsPosts, on_delete=models.CASCADE)
comment_content = models.TextField(max_length=65536)
date_created = models.DateTimeField(auto_now =False, auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
class ForumsCommentImages(models.Model):
id = models.AutoField(primary_key=True)
comment = models.ForeignKey(ForumsComments, on_delete=models.CASCADE)
images = models.ImageField(upload_to='ForumsCommentimages', blank=True, null=True )
Я сделал запрос, используя метод GET, переданный через ajax. Метод GET имеет один параметр, который называется «ForumsPosts ID».
В Django У меня есть функция просмотра следующим образом:
def forums_post_details(request):
if request.method == 'GET' and request.is_ajax():
post_id = request.GET.get('post_id')
data = GetPostDetails(post_id)
return JsonResponse(data, safe=False)
return JsonResponse({"error": "there was an error"}, status=status.HTTP_400_BAD_REQUEST)
Я борюсь с этой функцией GetPostDetails (post_id). Что я должен сделать, это запросить модель ForumsPosts и вернуть следующее:
- заголовок сообщения, «описание» содержимого, идентификатор пользователя, имя пользователя, дата создания, дата обновления, все комментарии, связанные с этим параметром. c отправлять "используя идентификатор сообщения" все изображения для каждого комментария в этом конкретном сообщении.
Меня смущает то, что несколько классов связаны внешним ключом "Я ХОЧУ СОХРАНИТЬ КАК ОНИ С КАЖДОГО ПОЧТЫ МОГУТ ИМЕТЬ НЕСКОЛЬКО КОММЕНТАРИЙ, И КАЖДЫЙ КОММЕНТАРИЙ МОЖЕТ ИМЕТЬ МНОГО ФОТОГРАФИЙ "
Каковы альтернативные способы «если это возможно, самый эффективный способ добиться этого» * 1017 *
Я хочу вернуть только один объект, имеющий словарь или наборы словарей, чтобы сделать их доступными в javascript позже или вернуть их как json объект
Я написал часть функции "GetPostDetails (post_id)", которая возвращает все, что я хочу, кроме всех комментариев и всех изображений под каждым комментарием. Я предполагаю, что будет много итераций.
Вот функция:
def GetPostDetails(post_id):
post_comments = []
comments_images = []
post_images = ForumsPostImages.objects.filter(post__id = post_id)
comments = ForumsComments.objects.filter(post__id = post_id)
for comment in comments:
comment_images = ForumsCommentImages.objects.filter(comment__id = comment.id)
for image in comment_images:
comment_images['image'] = {'id': comment.id, 'image': image.images}
details=[]
det = ForumsPosts.objects.all().order_by('-date_updated')
for d in det:
value= model_to_dict(d , fields=[field.name for field in forum._meta.get_fields()])
value['user'] = {'first_name': d.user.first_name, 'id': d.user.id, 'avatar':d.user.avatar }
d.user.image, 'date_joined': d.user.date_joined,}
details.append(value)
print(details)
return details
Пожалуйста, помогите мне завершить функцию GetPostDetails, чтобы вернуть все, что я хочу (заголовок публикации, контент) описание ", идентификатор пользователя, имя пользователя, дата создания, дата обновления, все комментарии, относящиеся к этому параметру c сообщение" используя идентификатор сообщения "все изображения для каждого комментария в этом конкретном сообщении)