Django 带外键的IntegrityError

Django 带外键的IntegrityError,django,Django,我有这些模型,州和城市 class State(models.Model): name = models.CharField(max_length=255) shortname = models.CharField(max_length=100) def __unicode__(self): return self.name class City(models.Model): name = models.CharField(max_lengt

我有这些模型,州和城市

class State(models.Model):
    name = models.CharField(max_length=255)
    shortname = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name


class City(models.Model):
    name = models.CharField(max_length=255)
    state = models.ForeignKey(State)

    def __unicode__(self):
        return self.name
当我保存表单时,我得到了一个“IntegrityError(1048,“state\u id”列不能为null”)。奇怪的是,状态被创建了,这就是我所做的

    def form_valid(self, form):
    city = form.cleaned_data['city_name']
    state = form.cleaned_data['state_name']

    m = State.objects.get_or_create(name=state)
    state_id = m[0].id
    City.objects.get_or_create(name=state, id=state_id)
    form.save()
我能做什么

    class StoreForm(ModelForm):
    class Meta:
        model = Store
        fields = '__all__'


class StoreGoogleMapForm(StoreForm):
    city_name = forms.CharField(
        widget=forms.TextInput(
            attrs={'readonly': 'readonly'}
        )
    )
    state_name = forms.CharField(
        widget=forms.TextInput(
            attrs={'readonly': 'readonly'}
        )
    )

    class Meta(StoreForm.Meta):
        exclude = (
            'state', 'city'
        )
        widgets = {
            'retailer': forms.HiddenInput(),
            'lon': forms.HiddenInput(),
            'lat': forms.HiddenInput(),
        }

    def clean(self):
        cleaned_data = super(StoreGoogleMapForm, self).clean()
        city_name = cleaned_data.get("city_name")
        state_name = cleaned_data.get("state_name")

        return cleaned_data


class NewStore(LoginRequiredMixin, CreateView):
model = Store
template_name = "new_store.html"
form_class = StoreGoogleMapForm

def get_context_data(self, **kwargs):
    ctx = super(NewStore, self).get_context_data(**kwargs)

    ctx['cobrand'] = self.retailer

    return ctx

def get(self, request, *args, **kwargs):
    self.retailer = get_object_or_404(Cobrand, pk=kwargs['pk'])

    self.object = Store(retailer=self.retailer)

    form_class = self.get_form_class()
    form = self.get_form(form_class)

    return self.render_to_response(self.get_context_data(form=form))

def form_valid(self, form):
    city = form.cleaned_data['city_name']
    state = form.cleaned_data['state_name']

    m = State.objects.get_or_create(name=state)
    City.objects.get_or_create(name=city, state=m[0])
    form.save()
    messages.add_message(
        self.request,
        messages.SUCCESS,
        'The store was successfuly created!',
        extra_tags='success'
    )
    return HttpResponseRedirect(self.get_success_url())

def get_success_url(self):
    return reverse_lazy('store_list', kwargs={'pk': self.kwargs['pk']})

def post(self, request, *args, **kwargs):
    self.retailer = get_object_or_404(Cobrand, pk=kwargs['pk'])

    self.object = Store(retailer=self.retailer)

    form_class = self.get_form_class()
    form = self.get_form(form_class)

    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)
将线路固定为

City.objects.get_or_create(name=city, state=m[0])
您不需要
form.save()


无论如何,这段代码有点奇怪,你的表单呢?

get\u或\u create返回两个参数,然后你可以直接将对象传递到下一个语句中

state, created = State.objects.get_or_create(name=state)
City.objects.get_or_create(name=state, state=state)

怀疑您不应该以有效的形式执行此操作,但如果没有代码的其余部分,则无法确定

@sax抱歉没有注意到更改为City.objects.get\u或\u create(name=City,state=m[0])好的,这里有点奇怪。由于
State.shortname
是必需的(无
null=True
),因此
State.objects.get\u或\u create(name=State)
如何工作?请共享
Store
modelvalid literal for int(),以10为基数:'California'with the state=m[0]->(1048,“Column'state\u id'不能为null”),我现在就发布表单,我粘贴整个视图