Python django-单用户对象可以存储模型的多个对象

Python django-单用户对象可以存储模型的多个对象,python,django,Python,Django,我正在制作一个django应用程序,其中一个用户可以在他的帐户中存储多个url。我面临的问题是,一个用户可以存储一个url,添加多个url时会出现完整性错误。 那么如何将多个url添加到单个用户对象中 型号.py class Userprofile(models.Model): user = models.OneToOneField(User) url = models.CharField(max_length = 100 ,) sh

我正在制作一个django应用程序,其中一个用户可以在他的帐户中存储多个url。我面临的问题是,一个用户可以存储一个url,添加多个url时会出现完整性错误。 那么如何将多个url添加到单个用户对象中

型号.py

class Userprofile(models.Model):
    user        = models.OneToOneField(User)    
    url         = models.CharField(max_length = 100 ,)
    shortcode   = models.CharField(max_length = 10 ,blank = True)
    timestamp   = models.DateTimeField(auto_now_add = True)

    def save(self , *args , **kwargs):
        if self.shortcode is None or self.shortcode is '':
            self.shortcode = create_shortcode(self)
            super(Userprofile, self).save(*args , **kwargs)

    def __str__(self):
        return self.user.username
class URLForm(forms.ModelForm):
    class Meta:
       model    = Userprofile 
       fields   = ('url',)
       widgets={
       'url':forms.TextInput(attrs={'placeholder':'Long URL','class':'form-control'}),
            }

    def clean_url(self):
        url  = self.cleaned_data['url']
        url_validator = URLValidator()
    try:
        url_validator(url)
    except:
        raise forms.ValidationError('Enter a proper URL ')
    return url      
def user_url_info(request):
  if request.method == 'POST':
    form = URLForm(request.POST)
    if form.is_valid():
        # try:
        #   obj = Userprofile.objects.get(url = form.cleaned_data['url'])
        #   print('already')
        # except:
        obj = form.save(commit = False)
        obj.user = request.user
        obj.save()
        return render(request , 'detaail.html',{'obj':obj}) 
  else:
    form    = URLForm() 
return render(request , 'urlform.html' ,{'form':form})     
forms.py

class Userprofile(models.Model):
    user        = models.OneToOneField(User)    
    url         = models.CharField(max_length = 100 ,)
    shortcode   = models.CharField(max_length = 10 ,blank = True)
    timestamp   = models.DateTimeField(auto_now_add = True)

    def save(self , *args , **kwargs):
        if self.shortcode is None or self.shortcode is '':
            self.shortcode = create_shortcode(self)
            super(Userprofile, self).save(*args , **kwargs)

    def __str__(self):
        return self.user.username
class URLForm(forms.ModelForm):
    class Meta:
       model    = Userprofile 
       fields   = ('url',)
       widgets={
       'url':forms.TextInput(attrs={'placeholder':'Long URL','class':'form-control'}),
            }

    def clean_url(self):
        url  = self.cleaned_data['url']
        url_validator = URLValidator()
    try:
        url_validator(url)
    except:
        raise forms.ValidationError('Enter a proper URL ')
    return url      
def user_url_info(request):
  if request.method == 'POST':
    form = URLForm(request.POST)
    if form.is_valid():
        # try:
        #   obj = Userprofile.objects.get(url = form.cleaned_data['url'])
        #   print('already')
        # except:
        obj = form.save(commit = False)
        obj.user = request.user
        obj.save()
        return render(request , 'detaail.html',{'obj':obj}) 
  else:
    form    = URLForm() 
return render(request , 'urlform.html' ,{'form':form})     
视图.py

class Userprofile(models.Model):
    user        = models.OneToOneField(User)    
    url         = models.CharField(max_length = 100 ,)
    shortcode   = models.CharField(max_length = 10 ,blank = True)
    timestamp   = models.DateTimeField(auto_now_add = True)

    def save(self , *args , **kwargs):
        if self.shortcode is None or self.shortcode is '':
            self.shortcode = create_shortcode(self)
            super(Userprofile, self).save(*args , **kwargs)

    def __str__(self):
        return self.user.username
class URLForm(forms.ModelForm):
    class Meta:
       model    = Userprofile 
       fields   = ('url',)
       widgets={
       'url':forms.TextInput(attrs={'placeholder':'Long URL','class':'form-control'}),
            }

    def clean_url(self):
        url  = self.cleaned_data['url']
        url_validator = URLValidator()
    try:
        url_validator(url)
    except:
        raise forms.ValidationError('Enter a proper URL ')
    return url      
def user_url_info(request):
  if request.method == 'POST':
    form = URLForm(request.POST)
    if form.is_valid():
        # try:
        #   obj = Userprofile.objects.get(url = form.cleaned_data['url'])
        #   print('already')
        # except:
        obj = form.save(commit = False)
        obj.user = request.user
        obj.save()
        return render(request , 'detaail.html',{'obj':obj}) 
  else:
    form    = URLForm() 
return render(request , 'urlform.html' ,{'form':form})     

因此,我希望request.user可以创建Userprofile的多个对象,您需要为Url创建一个模型,并在Url模型中连接外键用户id。存储冗余数据意味着数据库没有规范化。在这种情况下存储数据,并进行规范化,可以充分利用Django的对象关系模型。

您可以将url字段设置为foreignkey,并创建一个新模型来仅存储url

class UserURL(models.Model):    
    url = models.CharField(max_length = 100 ,)



class Userprofile(models.Model):
    user        = models.OneToOneField(User)    
    url         = models.Foreignkey(UserURL)
    shortcode   = models.CharField(max_length = 10 ,blank = True)
    timestamp   = models.DateTimeField(auto_now_add = True)

如果您询问如何将一个用户与多个URL关联,则不应只处理一个字段

class UserUrlRelationship(models.Model):
    url = models.CharField(...)
    user = models.ManyToManyField(User)

不要使用OneToOne字段或其他限制您的方法,使一个用户只映射到一个url,而反过来映射到同一个url(一个url只映射到一个用户)