как получить доступ к классам нескольких моделей, связанных с внешними ключами в Django - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть 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 сообщение" используя идентификатор сообщения "все изображения для каждого комментария в этом конкретном сообщении)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...