FYI, I was able to get this working with a small change to the query, from:

data = list(TestThing.objects.all().values('user__user_data',

                                           'thing_data',

                                           'user__testbridge__bridge_data'))


to:


data = list(TestThing.objects.all().values('user__user_data',

                                           'thing_data',

                                           'testbridge__bridge_data'))


(removing the highlighted code).

Somehow this extra level of indirection caused the query to lose the 
constraints of the one-to-many relationships between user and bridge and 
between thing and bridge, although I don't fully understand it.

Thanks for your response Mike.

-Don


On Sunday, July 21, 2019 at 3:58:03 PM UTC-7, Mike Dewhirst wrote:
>
> You can constrain uniqueness in the through table and/or the other tables 
> to represent whatever real-world constraints you need. Otherwise you can 
> have as many duplicated relationships as you want. Each through record has 
> its own id so the database is happy no matter how many go in. 
>
> *Connected by Motorola*
>
>
> Don Baldwin <[email protected] <javascript:>> wrote:
>
> Hi,
>
> I have a many-to-many relationship between users and things, where a user can 
> select multiple things,
> and a thing can be selected by multiple users.  The relationship between 
> users and things also
> contains data, so I've specifically setup a through table.
>
> When I add a user to a thing, I guess I expect a one-to-one relationship 
> between the thing and
> the intervening bridge, but it seems like I'm getting a one-to-many.
>
> Here is my code:
>
> models.py:
>
>     class TestUser(models.Model):
>         user_data = models.TextField(default="")
>     
>         def __str__(self):
>             return "Other: " + self.user_data
>     
>     class TestThing(models.Model):
>         thing_data = models.TextField(default="")
>         user = models.ManyToManyField(TestUser, through='TestBridge')
>     
>         def __str__(self):
>             return "Thing: " + self.thing_data
>     
>     class TestBridge(models.Model):
>         user = models.ForeignKey(TestUser, on_delete=models.CASCADE)
>         thing = models.ForeignKey(TestThing, on_delete=models.CASCADE)
>         bridge_data = models.TextField(default="")
>     
>         def __str__(self):
>             return "Bridge: " + self.bridge_data
>
> tests.py:
>
>         u_1 = TestUser(user_data = 'user')
>         u_1.save()
>         t_1 = TestThing(thing_data='thing 1')
>         t_1.save()
>         t_2 = TestThing(thing_data='thing 2')
>         t_2.save()
>
>         t_1.user.add(u_1, through_defaults={'bridge_data': 'bridge 1'})
>         t_2.user.add(u_1, through_defaults={'bridge_data': 'bridge 2'})
>
>         data = list(TestThing.objects.all().values('user__user_data',
>                                                    'thing_data',
>                                                    
> 'user__testbridge__bridge_data'))
>         for item in data:
>             print(item)
>
> Output:
>
>     {'user__user_data': 'user', 'thing_data': 'thing 1', 
> 'user__testbridge__bridge_data': 'bridge 1'}
>     {'user__user_data': 'user', 'thing_data': 'thing 1', 
> 'user__testbridge__bridge_data': 'bridge 2'}
>     {'user__user_data': 'user', 'thing_data': 'thing 2', 
> 'user__testbridge__bridge_data': 'bridge 1'}
>     {'user__user_data': 'user', 'thing_data': 'thing 2', 
> 'user__testbridge__bridge_data': 'bridge 2'}
>     
> What I expect:
>
>     {'user__user_data': 'user', 'thing_data': 'thing 1', 
> 'user__testbridge__bridge_data': 'bridge 1'}
>     {'user__user_data': 'user', 'thing_data': 'thing 2', 
> 'user__testbridge__bridge_data': 'bridge 2'}
>
> How do I get rid of the relationships between thing 1 and bridge 2, and 
> between thing 2 and bridge 1?
>
> Thanks for your responses.
>
> -Don
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] <javascript:>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/django-users/CAKL%3DYPH5OCd9wYNG%2BZ4R0%3DuYOEW0hfhRngqfudeaGqCjB6Yfrg%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/django-users/CAKL%3DYPH5OCd9wYNG%2BZ4R0%3DuYOEW0hfhRngqfudeaGqCjB6Yfrg%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" 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-users/2d668b13-cbfe-4fe3-bf92-9bd2900ec26b%40googlegroups.com.

Reply via email to