Изменение модели Django с ForeignKey на ManytoMany с неверными именами полей, заданными в select_related: 'group'.Выбор: пользователь - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу сменить модель поста.Раньше у меня было очень простое отношение.Есть 3 модели User, Post и Group.Пользователь может создавать сообщения, и сообщение должно принадлежать 1 группе. пример: Пользователь Samir написал сообщение о Футбол.Этот пост принадлежит группе Спорт.Ниже показано, как выглядят модели

Более ранняя модель:

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts')
    group = models.ForeignKey(Group, related_name='posts')
    title = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True, max_length=500)
    message = models.TextField()   

Я хочу изменить это так, чтобы каждое сообщение могло принадлежать максимум 3 и минимум 1группа.

Ниже представлена ​​моя модель

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts')
    group = models.ManyToManyField(Group, related_name='posts', max_length=3)
    title = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True, max_length=500)
    message = models.TextField()

Пост успешно создан, но не перенаправляет на страницу с подробностями поста и выдает ошибку ниже.Также в админке django группа в постах пуста.Ниже мой DetailView

Мои просмотры:

from braces.views import SelectRelatedMixin

class PostDetail(SelectRelatedMixin, DetailView):
    model = Post
    select_related = ('user', 'group')

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user__username__iexact=self.kwargs.get('username'))

    def get_context_data(self, **kwargs):
        context = super(PostDetail, self).get_context_data()            
        return context

Мой URL для DetailView:

url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.PostDetail.as_view(), name='single'),

Ниже ошибка enter image description here

Я попытался изменить select_related на prefetch_related, но проблема все еще сохраняется.Как мне это исправить

******* Ниже на основе решения @ Ruddra *****

Извините, я считаю, что это почти решено.После того, как я изменил связанное с выбором, я получил следующую ошибку

enter image description here

Я полагаю, что это может иметь какое-то отношение к URL моей группы, Ниже приведены мои группы model, view и url, которые очень просты

Модель

class Group(models.Model):
    name = models.CharField(max_length=250, unique=True)
    description = models.TextField(default='', blank=True)
    members = models.ManyToManyField(User, through='GroupMember')

Вид представляет собой 1 вкладыш

class GroupCreate(LoginRequiredMixin, CreateView):
    model = Group
    fields = ('name', 'description')


class GroupList(ListView):
    model = Group


class GroupDetail(DetailView):
    model = Group

И, наконец, Url - это

url(r'^posts/in/(?P<slug>[-\w]+)/$', views.GroupDetail.as_view(), name='single'),

Как вы думаете, что я делаю неправильно

1 Ответ

0 голосов
/ 05 декабря 2018

Согласно документации :

Возвращает QuerySet, который будет "следовать" за отношениями внешний ключ , выбирая дополнительные данные связанного объекта при выполненииего запрос.Это повышение производительности, которое приводит к одному более сложному запросу, но означает, что дальнейшее использование отношений внешний ключ не потребует запросов к базе данных.

Значит select_related будет работатьтолько для OneToOne и ForignKey отношений.

Здесь вы используете SelectRelatedMixin и оно имеет select_related.В этом поле есть группа и пользователь .Это может быть причиной проблемы.Вместо этого используйте PrefethRelatedMixin , например:

class PostDetail(PrefetchRelatedMixin, DetailView):
    model = Post
    prefetch_related = ('user', 'group')
...