form.save()填充lates行而不是创建一个新的 - Django

时间:2018-06-13 15:40:10

标签: django post django-models django-forms django-views

我尝试使用post语句创建Klient,但不是在DB中创建新行,而是替换最新的行。

我的观点是从一个POST创建两个模型。最终代码应检查是否存在Klient版本,如果是,则仅创建预订。

型号:

class Klient(models.Model):
  namn = models.CharField(max_length=124)
  adress = models.CharField(max_length=124)
  kontakt = models.CharField(max_length=124)

class KlientForm(ModelForm):
  class Meta:
    model = Klient
    fields = ['namn', 'adress', 'kontakt']

class Bokning(models.Model):
    klient = models.ForeignKey('Klient', on_delete=models.CASCADE)
    referens = models.IntegerField(null=True, blank=True)
    pumpStr = models.IntegerField(null=True, blank=True)
    slangStr = models.IntegerField(null=True, blank=True)
    pump = models.IntegerField(null=True, blank=True)
    maskinist = models.CharField(max_length=124, blank=True)
    betongLev = models.CharField(max_length=124, blank=True)
    betongKvalite = models.CharField(max_length=124, blank=True)
    bestalld = models.IntegerField(null=True, blank=True)
    pumpMng = models.IntegerField()
    datum = models.DateField()
    littNr = models.IntegerField()
    arbNr = models.IntegerField(null=True, blank=True)
    resTid = models.IntegerField()
    grundavgift = models.IntegerField()
    pumpStart = models.DateTimeField()
    pumpSlut = models.DateTimeField()
    ovrigInfo = models.CharField(max_length=124, blank=True

class BokningForm(ModelForm):
    class Meta:
        model = Bokning
        fields = [
            'referens',
            'pumpStr',
            'slangStr',
            'pump',
            'maskinist',
            'betongLev',
            'betongKvalite',
            'bestalld',
            'pumpMng',
            'datum',
            'littNr',
            'arbNr',
            'resTid',
            'grundavgift',
            'pumpStart',
            'pumpSlut',
            'ovrigInfo']

查看:

def bokning(request):
if request.method == 'POST':
    klientForm = KlientForm(json.loads(request.body.decode()))
    bokningForm = BokningForm(json.loads(request.body.decode()))
    if klientForm.is_valid() and bokningForm.is_valid():
        klient = klientForm.save()
        bokning = bokningForm.save(commit=False)
        bokning.klient = klient
        bokning.save()
        return HttpResponse(status=201)
    else:
        return HttpResponse(status=400)
else:
    return HttpResponseNotAllowed(['POST'])

尝试连续创建多个Boking或Klient会导致创建最新版本的更新版本。除了测试断言之外,它不会产生任何错误。

感谢。

1 个答案:

答案 0 :(得分:0)

我的问题出现在我的测试中,而不是我的观点。我喜欢发送POST请求的两个测试,比如

def test_postBokning(self):
     response = self.client.post('/api/bokning/', json.dumps('a bunch of json'}), content_type='application/json')
     #assertions
def test_postBokningCopy(self):
     response = self.client.post('/api/bokning/', json.dumps('a bunch of json'}), content_type='application/json')
     #assertions

我将最后一个POST移到第一个测试中,这样就删除了我的问题。