小编ako*_*ian的帖子

将自定义查询集传递给Django Rest Framework中的序列化程序

我正在使用Django rest framework 2.3我有一个这样的类

class Quiz():
    fields..

# A custom manager for result objects
class SavedOnceManager(models.Manager):                                                                                                                                                                                                
    def filter(self, *args, **kwargs):
        if not 'saved_once' in kwargs:
            kwargs['saved_once'] = True
        return super(SavedOnceManager, self).filter(*args, **kwargs)

class Result():
    saved_once = models.NullBooleanField(default=False, db_index=True,
                                         null=True)
    quiz = models.ForeignKey(Quiz, related_name='result_set')

    objects = SavedOnceManager()
Run Code Online (Sandbox Code Playgroud)

如您所见,我在结果上有自定义管理器,因此Result.objects.filter()只返回save_once设置为True的结果

现在我的Serializers看起来像这样:

class ResultSerializer(serializers.ModelSerializer):                                                                                                                                                                                                    
      fields...

class QuizSerializer(serializers.ModelSerializer):                                                                                                                                                                                                      
    results = ResultSerializer(many=True, required=False, source='result_set')
Run Code Online (Sandbox Code Playgroud)

现在,如果我序列化我的测验,它将只返回已saved_once设置的结果True.但对于特定用例,我希望序列化程序返回所有对象.我已经读过,我可以通过传递一个queryset参数http://www.django-rest-framework.org/api-guide/relations/(进一步注释部分)来做到这一点.但是,当我尝试这个

results = ResultSerializer(many=True, required=False, source='result_set',
                           queryset=
                               Result.objects.filter(
                               saved_once__in=[True, False]))
Run Code Online (Sandbox Code Playgroud)

我得到TypeError: …

python django django-rest-framework

9
推荐指数
1
解决办法
8199
查看次数

访问Formsets中的多个"通过"关系字段

我的模特:

class End_User(models.Model):
    location = models.ForeignKey(Location) 
    first_name = models.CharField(max_length=70, blank=True, null=True)
    email_address = models.CharField(max_length=70, blank=True, null=True)

class Phone_Client(models.Model):
    end_user = models.ManyToManyField(End_User)
...
    extensions = models.CharField(max_length=20)

class Line(models.Model):
    phone_client = models.ManyToManyField(Phone_Client, through='Phone_Line' )
    ....
    voicemail = models.BooleanField(default=False)  

class Phone_Line(models.Model):
    phone_client = models.ForeignKey(Phone_Client)
    line = models.ForeignKey(Line)
    line_index = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

所以基本上一个终端用户可以拥有多部手机,一部手机可以拥有多条线路,通过Phone_line相关.

我的页面需要编辑所有这些对象,并为同一页面中的Phone_Clients和Line all创建运行时的新实例.目前我正在为Phone_Client和Lines创建一个简单的End_User模型表单和modelformset_factory对象.由于手机可以有很多行,因此phone_formset中的每个手机表单都可以有一个行表单集对象.我目前正在做这样的事情

end_user = End_User.objects.get(pk=user_id)
user_form = End_UserForm(instance=end_user)

Phone_ClientFormSet = modelformset_factory(Phone_Client,form=PartialPhone_ClientForm,  extra=0, can_delete=True)

phone_clients_formset = Phone_ClientFormSet(queryset=end_user.phone_client_set.all(), prefix='phone_client')

all_lines = modelformset_factory(Line, form=PartialLineForm, extra=0, can_delete=True)

phone_clients = end_user.phone_client_set.all()

client_lines_formsets = {}
for phone in …
Run Code Online (Sandbox Code Playgroud)

django django-templates django-forms django-orm

8
推荐指数
1
解决办法
4713
查看次数

从模型formset django动态删除表单

我有一个网页,用户可以动态添加和删除表单到django formsets.

我已经阅读了使用Ajax动态地将表单添加到Django formset,基于此我可以动态地将表单添加到formset.现在我想动态删除formset.我在Django中查看了动态删除内联表单集

我想要这样做的方法是当用户点击删除时,我有一个ajax函数,它从数据库中删除表单实例记录.当我的ajax函数返回时,我保持相同的total_form_count和initial_form_count,只隐藏表单html,以便在我的POST中提交已删除的记录.

最初,formset将其表单元素呈现为:

#form0
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id">
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field">
#form1
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id">
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field">
#form2
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id">
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field">
Run Code Online (Sandbox Code Playgroud)

现在假设我在删除记录后动态删除表单0,使用ajax,我不更改表单计数,因此total_form_count和initial_form_count为3.

(如果我在这种情况下将total_form_count和initial_form_count减少为2,当我在视图中使用POST数据填充formset时,它应该以form0和form1的形式排序.但在我的情况下,有效的表单是form1和form2)

现在在我看来,我做了类似以下的事情来保存我的表格.

myformset = modelformset_factory(ObjectElement,form=Object_Form, extra=0, can_delete=True)
for form in myformset.forms:
    print(form.instance.id) #this does not print id of deleted record, but of the first existing record in the database.
    print(form.instance.attribute)# this prints …
Run Code Online (Sandbox Code Playgroud)

django django-models django-forms

7
推荐指数
1
解决办法
7474
查看次数

在django中的formset中使用单选按钮

我有一个页面,我使用formsets显示不同的表单.

这些是我的模特:

class Phone(models.Model):
    mac = models.CharField()

class PhoneLine(models.Model):
    phone = models.ForeignKey(Phone)
    voicemail = models.BooleanField("Voice Mail", default=False)
Run Code Online (Sandbox Code Playgroud)

手机可以有多条线路(电话线),但只有一条电话线可以启用语音信箱.

默认情况下,当我使用formset显示phonelines时,语音邮件字段显示为如下复选框.(我已根据要求在formset中添加了前缀)

form1 of the formset
<input type="checkbox" name="phone_client_line_1-0-voicemail" id="id_phone_client_line_1-0-voicemail">

form2 of the formset
<input type="checkbox" name="phone_client_line_1-1-voicemail" id="id_phone_client_line_1-1-voicemail">
Run Code Online (Sandbox Code Playgroud)

(选中和取消选中复选框会更新后端)

基于这个线程,Django - 在一个formset中将BooleanField显示为一组单选按钮,我修改了我的phoneline表单的init和add_prefix方法,现在将语音邮件字段显示为单选按钮.

class PhoneLineForm(ModelForm):

def __init__ (self, *args, **kwargs):
    super(PhoneLineForm, self).__init__(*args, **kwargs)
    self.fields['voicemail'] = BooleanField( widget = RadioSelect(choices=((self.prefix+"-"+str("voicemail"), 'Voicemail LIne'),)))

def add_prefix(self, field):
    if field == 'voicemail': return ('%s_%s') %(field, self.instance.phone.id)
    else: return self.prefix and ('%s-%s' % (self.prefix, field)) …
Run Code Online (Sandbox Code Playgroud)

django django-forms radio-button

5
推荐指数
1
解决办法
1028
查看次数

在保存 Django 期间将参数从部分表单传递到模型

我有一个包含许多字段的模型,我正在为其创建两个部分表单

#model
class Line_Settings(models.Model):
....
    line = models.ForeignKey(Line)
    All = models.BooleanField(default=False)
    Busy = models.BooleanField(default=False)
    MOH = models.CharField(max_length=100, blank=True, null=True)
    PLAR = models.CharField(max_length=100, blank=True, null=True)
....

    def save(self, commit = True, *args, **kwargs):
       ....
#Partial model form1
class General(ModelForm):
    class Meta:
        model = Line_Settings
        fields = ('MOH','PLAR')
#Partial model form2        
class Common(ModelForm):
    class Meta:
        model = Line_Settings
        fields = ('All','Busy') 
Run Code Online (Sandbox Code Playgroud)

我已经覆盖了 Line_Settings 模型的保存以执行其他逻辑。

我需要能够将一些参数传递给覆盖的 save 方法以在我的逻辑中使用。

在我的视图中,我用 post 数据填充了两个部分表单,并且可以调用 save。

call_forwards = Common(request.POST, instance=line_settings)
general = General(request.POST, instance=line_settings)
Run Code Online (Sandbox Code Playgroud)

我需要像这样将参数传递给保存:

call_forwards.save(parameter="value")
general.save(parameter="value") …
Run Code Online (Sandbox Code Playgroud)

django django-models django-forms

5
推荐指数
1
解决办法
4434
查看次数

无法使用部署密钥(bitbucket)EC2进行克隆

我无法使用部署密钥将我的存储库克隆到远程EC2 ubuntu实例.以下是我遵循的步骤.

  1. 我删除了我在bitbucket帐户中的现有部署密钥
  2. ~/.ssh/know_hosts按照/sf/answers/1856447701/进行了清理
  3. 我按照这些步骤生成了我的新密钥 ,并将其作为部署密钥添加到repo中.
  4. 这是输出 ssh -T git@bitbucket.org

    You can use git or hg to connect to Bitbucket. Shell access is disabled. This deploy key has read access to the following repositories: username/repository: KEYNAME -- email@gmail.com

  5. 但是当我尝试克隆存储库时,
    sudo git clone git@bitbucket.org:username/repository.git我收到以下错误 Cloning into 'repository'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

我在这里错过了什么吗?有人有什么建议吗?

谢谢阅读.

git ssh bitbucket amazon-ec2

3
推荐指数
1
解决办法
2478
查看次数