djangoでポートフォリオマネージャーアプリを作成しようとしています。ホルダーを主キーにしてみました。ただし、その場合、新しいエントリは古いエントリと重複します。そこで、そのデータベースを削除して、新たに始めました。ログインしたユーザーでポートフォリオを追加しようとすると、次のようなエラーが発生します。-
IntegrityError-NOT NULL制約が失敗しました:portfolio_myportfolio.holder_id
また、ユーザーが同じnsecodeで同じ株の数量を追加した場合、新しい行を作成するのではなく、前のエントリに追加するようにデータベースを設定したいと思いました。その場合、私のシナリオはどうあるべきか。
私はpythonとdjangoに非常に慣れていないので、私のコードはクリーンではなく、コードが数行ある可能性がありますが、これは不要です。このようなエラーを削除するための支援をいただければ幸いです。
私のモデルは
from django.db import models
from django.contrib.auth.models import User
codes=(tuple of tuples)
class MyPortfolio(models.Model):
nsecodes = models.CharField(max_length=10, choices=codes)
quantity = models.PositiveIntegerField()
buyvalue=models.DecimalField(max_digits=15,decimal_places=2)
holder = models.ForeignKey(User, related_name='myportfolio')
# Create your models here.
私の見解。pyは:
from django.shortcuts import render,redirect,get_object_or_404
from django.views.generic.edit import CreateView
from .models import MyPortfolio
from .forms import AddNewForm
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
def home(request):
return render(request,'home.html')
@login_required
def my_portfolio(request):
if request.user.is_authenticated():
myportfolios=MyPortfolio.objects.filter(holder=request.user)
return render(request, 'my_portfolio.html',{'myportfolios':myportfolios})
@login_required
def add_new_form(request):
if request.user.is_authenticated():
myportfolios = MyPortfolio.objects.filter(holder=request.user)
if request.method=="POST":
form=AddNewForm(request.POST)
if form.is_valid():
myportfolio=form.save()
myportfolio.nsecodes=form.cleaned.data.get('nsecodes')
myportfolio.buyvalue = form.cleaned.data.get('buyvalue')
myportfolio.quantity = form.cleaned.data.get('quantity')
myportfolio.holder=request.user
myportfolio.save()
return redirect('my_portfolio')
else:
form=AddNewForm()
return render(request,'add_new.html',{'form':form,'myportfolios':myportfolios})
私のforms.pyは以下の通りです:-
class AddNewForm(forms.ModelForm):
nsecodes=forms.ChoiceField(choices=codes, required=True)
quantity=forms.IntegerField(min_value=1,required=True)
buyvalue=forms.DecimalField(max_digits=10, decimal_places=2,required=True,min_value=.01)
class Meta:
model=MyPortfolio
fields=['nsecodes','quantity','buyvalue']
外部キーIDを割り当てる前にデータを保存しています
これを試して
if form.is_valid():
myportfolio=form.save(commit=False)
myportfolio.holder=request.user
myportfolio.save()
return redirect('my_portfolio')
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加