#32011: Error when calling add() on ManyRelatedManager with intermediary model
-------------------------------------+-------------------------------------
               Reporter:  Philipp    |          Owner:  nobody
  Maino                              |
                   Type:  Bug        |         Status:  new
              Component:             |        Version:  2.1
  Documentation                      |       Keywords:  ManyToMany,
               Severity:  Normal     |  ManyRelatedManager
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Django is not managing our databases for us, therefor I created the table
 RulesetRuleMap to handle the ManyToMany relationship between Ruleset and
 Rule: Each Ruleset can consist of multiple Rules and each Rule can be used
 in multiple Rulesets.

 **Models**
 {{{
 class Rule(models.Model):
     id = models.BigAutoField(primary_key=True)
     percentage_of_total = models.FloatField(blank=False, null=False)
     _rule_parameter = models.ForeignKey('RuleParameter',
 models.DO_NOTHING, blank=False, null=False)

     class Meta:
         managed = False
         db_table = '_rule'


 class Ruleset(models.Model):
     id = models.BigAutoField(primary_key=True)
     name = models.CharField(max_length=300, blank=False, null=False)
     description = models.CharField(max_length=300, blank=False,
 null=False)
     rules = models.ManyToManyField('Rule', through="RulesetRuleMap")

     class Meta:
         managed = False
         db_table = '_ruleset'


 class RulesetRuleMap(models.Model):
     id = models.BigAutoField(primary_key=True)
     _rule = models.ForeignKey('Rule', models.CASCADE)
     _ruleset = models.ForeignKey('Ruleset', models.CASCADE)

     class Meta:
         managed = False
         db_table = '_ruleset_rule_map'
 }}}
 **Serializers**
 {{{
 class RulesetRuleMapSerializer(serializers.ModelSerializer):
     class Meta:
         model = db_models.RulesetRuleMap
         fields = '__all__'


 class RuleSerializer(serializers.ModelSerializer):
     class Meta:
         model = db_models.Rule
         fields = '__all__'


 class RulesetSerializer(serializers.ModelSerializer):
     rules = RuleSerializer(many=True)
     class Meta:
         model = db_models.Ruleset
         fields = '__all__'

     def create(self, validated_data):
         rules_data = validated_data.pop('rules')
         ruleset = db_models.Ruleset.objects.create(**validated_data)
         rules_storage =[]
         for rule_data in rules_data:
             rule, created =
 db_models.Rule.objects.get_or_create(**rule_data)
             rules_storage.append(rule)
         ruleset.rules.add(*rules_storage, through_defaults={})
         return ruleset
 }}}
 On a homepage the user can add/modify a Ruleset and add/modify the
 assosiated Rules. On submission we receive a payload like this:
 {{{
 {
   "id": None,
   "name": "Split_50.0_Param1_50.0_Param2",
   "description": "test",
   "rules": [
     {
       "id": None,
       "percentage_of_total": "50",
       "tc_rule_parameter": "3"
     },
     {
       "id": None,
       "percentage_of_total": "50",
       "tc_rule_parameter": "2"
     }
   ]
 }
 }}}
 As described in [https://www.django-rest-framework.org/api-guide/relations
 /#writable-nested-serializers/ DRF] I defined a custom create() for the
 nested RulesetSerializer to handle the creation of multiple objects.
 According to [https://docs.djangoproject.com/en/3.1/topics/db/models
 /#extra-fields-on-many-to-many-relationships / Django] one should be able
 to


 ----
 use add(), create(), or set() to create relationships, as long as you
 specify through_defaults for any required fields.
 ----

 When executing ruleset.rules.add(*rules_storage, through_defaults={}) I
 get the error

 **''{TypeError}add() got an unexpected keyword argument
 'through_defaults'''**

 When executing ruleset.rules.add(*rules_storage) I get the error

 **''{AttributeError}Cannot use add() on a ManyToManyField which specifies
 an intermediary model.Use database_models.TcRulesetRuleMap's Manager
 instead.''**

 Is there a mistake in my model and/or serializer set up or is there a bug
 in django?

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32011>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.af790b580fbbe39b5767d15b0665b5a1%40djangoproject.com.

Reply via email to