Python django-单用户对象可以存储模型的多个对象
我正在制作一个django应用程序,其中一个用户可以在他的帐户中存储多个url。我面临的问题是,一个用户可以存储一个url,添加多个url时会出现完整性错误。 那么如何将多个url添加到单个用户对象中 型号.pyPython 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
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只映射到一个用户)