Джанго, как получить две модели в отношении?

Существует еще одна функция stacktrace, предлагаемая семейством Throwable - возможность управлять информацией о трассировке стека.

Стандартное поведение:

package test.stack.trace;

public class SomeClass {

    public void methodA() {
        methodB();
    }

    public void methodB() {
        methodC();
    }

    public void methodC() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

Трассировка стека:

Exception in thread "main" java.lang.RuntimeException
    at test.stack.trace.SomeClass.methodC(SomeClass.java:18)
    at test.stack.trace.SomeClass.methodB(SomeClass.java:13)
    at test.stack.trace.SomeClass.methodA(SomeClass.java:9)
    at test.stack.trace.SomeClass.main(SomeClass.java:27)

Манипулированная трассировка стека:

package test.stack.trace;

public class SomeClass {

    ...

    public void methodC() {
        RuntimeException e = new RuntimeException();
        e.setStackTrace(new StackTraceElement[]{
                new StackTraceElement("OtherClass", "methodX", "String.java", 99),
                new StackTraceElement("OtherClass", "methodY", "String.java", 55)
        });
        throw e;
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

Трассировка стека:

Exception in thread "main" java.lang.RuntimeException
    at OtherClass.methodX(String.java:99)
    at OtherClass.methodY(String.java:55)
1
задан Venom 25 March 2019 в 13:12
поделиться

2 ответа

Прежде всего, вам следует немного изменить свой статус.

STATUSES = (
(0, 'unpaid'),
(1, 'paid')
)

class Post_Paid_Sell_Tut(models.Model):
    paying_user = models.ForeignKey(User, on_delete=models.CASCADE)
    post_sell_tut = models.ForeignKey(Post_Sell_Tut, on_delete=models.CASCADE)
    STATUS = models.IntegerField(choices=STATUSES, default=0)

Это облегчит последующие поиски в базе данных и прояснит проблемы. Тогда, если вы просто обновляете статус, вам не нужна никакая форма.

def post_sell_tut_buy(request, pk):
    post = get_object_or_404(Post_Sell_Tut, pk=pk)
    if request.user == post.author:
        messages.error(request, 'You cant buy your own Post!')
        return redirect('post_sell_tut_detail', pk=pk)
    else:
        template = 'Post_Sell_Tut/post_sell_tut_buy.html'
        post.STATUS = 1  # You are updating the STATUS
        post.save() # you are writing the change to database
        context = {
            'post': post
        }
        return render(request, template, context)

Кроме того, передавая post экземпляр в шаблон, вы хотите просмотреть информацию, вы должны следовать этому:

def post_sell_tut_buy(request, pk):
    post = Post_Paid_Sell_Tut.objects.select_related('post_sell_tut').filter(pk=pk)
    if request.user == post.author:
        messages.error(request, 'You cant buy your own Post!')
        return redirect('post_sell_tut_detail', pk=pk)
    else:
        template = 'Post_Sell_Tut/post_sell_tut_buy.html'
        post.STATUS = 1  # You are updating the STATUS
        post.save() # you are writing the change to database
        context = {
            'post': post
        }
        return render(request, template, context)

Я добавил select_related, потому что, когда вы пытаетесь получить информацию по внешнему ключу из post это не вызовет дополнительный запрос к БД .

ОБНОВЛЕНИЕ

def post_sell_tut_buy(request, pk):
    post = Post_Sell_Tut.objects.select_related('author).filter(pk=pk)
    if request.user == post.author:
        messages.error(request, 'You cannot buy POst(s) you created by your own!')
        return redirect('post_sell_tut_detail', pk=post.pk)
    else:
        template = 'Post_Sell_Tut/post_sell_tut_buy.html'
        context = {
            'post': post,
        }
        return render(request, template, context)

Вы не можете получить доступ к STATUS из модели Post_Sell_Tut. У него нет этого поля.

def post_sell_tut_buy_exec(request, pk):
    post_sell_tut = get_object_or_404(Post_Sell_Tut, pk=pk)
    post_paid_sell_tut = Post_Paid_Sell_Tut.objects.filter(post_sell_tut=post_sell_tut)
    if request.user == post.author:
        messages.error(request, 'You cannot buy Post(s) you created by your own!')
        return redirect('post_sell_tut_detail', pk=post.pk)
    else:
        template = 'Post_Sell_Tut/post_sell_tut_buy.html'
        post_paid_sell_tut.STATUS = 1
        post_paid_sell_tut.save()
        context = {
            'post': post
        }
        return render(request, template, context)
0
ответ дан Rarblack 25 March 2019 в 13:12
поделиться

просто создайте объект «Post_Paid_Sell_Tut», когда пользователь просит купить пост

 def post_sell_tut_buy(request, pk):
    post = get_object_or_404(Post_Sell_Tut, pk=pk)
    if request.user == post.author:
        messages.error(request, 'You cant buy your own Post!')
        return redirect('post_sell_tut_detail', pk=post.pk)
    else:
        try:
            # throws an exception if not bought yet
            Post_Paid_Sell_Tut.get(paying_user=request.user, post_sell_tut=post) 
            messages.success(request, 'you allready have this post!')
            # ... other stuff

        except Post_Paid_Sell_Tut.DoesNotExist:
            # create Post_Paid_Sell_Tut object indicating that the user bought the post
            ppst = Post_Paid_Sell_Tut(paying_user=request.user,
                                        post_sell_tut=post, status="paid")
            ppst.save()
            messages.success(request, 'post is yours :)!')
            # ... other stuff
0
ответ дан Sina Parvizi 25 March 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: